postgresql: So benennen Sie eine Tabelle in einem Schema um

76

Ich verwende PostgreSQL 9.x und möchte eine Tabelle umbenennen. Dieser SQL-Code:

CREATE TABLE new (id int);
ALTER TABLE new RENAME TO old;
DROP TABLE old;

benennt die Tabelle korrekt um. Aber dieser SQL-Code:

CREATE SCHEMA domain;
CREATE TABLE domain.old (id int);
ALTER TABLE domain.old RENAME TO domain.new;

schlägt mit Fehler fehl:

FEHLER: Syntaxfehler bei oder in der Nähe von "."

Das "." unterstrichen ist der zwischen 'domain' und 'new'

comte
quelle
8
Hilfreiche Frage (und Antwort), aber das Umbenennen von Neu in Alt klingt rückwärts :)
Dwanderson
Ja, das ist richtig. Man sollte domain.genuine anstelle von domain.new und domain.new anstelle von domain.old lesen. Ich habe meine Frage so belassen, weil die Korrektur dieses Logikproblems mit der akzeptierten Antwort in Konflikt geraten würde.
Comte

Antworten:

136

Ein Weg, dies zu tun:

ALTER TABLE domain.old RENAME TO new

Andere Weise:

SET search_path TO domain;
ALTER TABLE old RENAME TO new;

Dokumentation für search_path.

Bohuslav Burghardt
quelle
1
thx das funktioniert für allgemeine Zwecke, aber mein aktueller Fall ist etwas komplexer ... nach dem Refactoring, das aus Benennungstabellen mit singulären Namen besteht, möchte ich domain.users in domain.user umbenennen! Mit SET muss ich ALTER TABLE-Benutzer schreiben. RENAME TO 'user'; aber weder '' noch [] Notation funktionieren mit RENAME TO scheint ... Ich habe in beiden Fällen einen Syntaxfehler ... irgendeinen Hinweis?
Comte
@comte Es wurde eine weitere Lösung hinzugefügt, die ein Einzeiler ist (sie ist dieselbe wie Ihre ursprüngliche, geben Sie nur nicht das Schema für alt an, sie bleibt gleich)
Bohuslav Burghardt
Ihr Einzeiler funktioniert perfekt mit jedem nicht reservierten Tabellennamen als neuem Namen. Gleichermaßen funktioniert es nicht mit reservierten Schlüsselwörtern zwischen '' oder []
comte
3
@comte: Die doppelten Anführungszeichen für Bezeichner werden vom SQL-Standard verlangt und dies ist im Handbuch gut dokumentiert: postgresql.org/docs/current/static/… Nicht sicher, warum Sie diese Überraschung finden
a_horse_with_no_name
4
Wenn Sie Zeit für Polemiken haben, sollten Sie in meinen Anmerkungen gelesen haben, dass ich auch Klammern ausprobiert habe, die bei einigen anderen SQL-Engines (zumindest bei MS-Produkten wie SQL Server) üblich sind, und dass einfache Anführungszeichen, Klammern und doppelte Anführungszeichen sind auch von anderen erlaubt (z. B. SQL Lite). Sie sagen zu Recht, dass doppelte Anführungszeichen der SQL-92-Standard sind, aber dann lautet die Frage: Entspricht postgresql zu 100% dem SQL-Standard? AFAIK antwortet wie viele Motoren negativ.
Comte
1
  1. Wechseln Sie zu Ihrer Datenbank
machine$\c my_database
  1. Tename die Datenbank
my_databse=# alter table old_name rename to new_name;
7guyo
quelle