2015-07-14 7 views
8

Wie kann ich den Verweis auf eine Tabelle in PostgreSQL ändern, wenn der Tabellenname geändert wurde?Wie ändert man "REFERENZEN" in PostgreSQL?

Sagen, ich habe:

CREATE TABLE example1 (
    id serial NOT NULL PRIMARY KEY, 
    name varchar(100) 
); 

CREATE TABLE example2 (
    id serial NOT NULL PRIMARY KEY, 
    example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED 
); 

Später ich:

ALTER TABLE example1 RENAME TO example3; 

Wie die Definition des Fremdschlüssel ändern?

example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED, 
+1

Erstens Sie suchen, zu helfen, diese heißt Fremdschlüsseleinschränkung. Zweitens, ich bin nicht klar, was Sie tun möchten. Die Einschränkung zeigt nach einem Umbenennen weiterhin auf die Tabelle. Es würde für Postgres nicht sinnvoll sein, auf einen Namen zu zeigen, der nicht existiert. Oder meinst du, du willst die Spalte 'example1fk' umbenennen, damit sie mit dem neuen Tabellennamen übereinstimmt? – IMSoP

+0

IMSoP hat Recht: Es gibt nichts, was Sie tun müssen. Postgres kümmert sich um alles. –

+0

Haben Sie das Umbenennen versucht und sehen Sie, was es mit den FK-Einschränkungen gemacht hat? –

Antwort

10

Interne Abhängigkeiten zwischen Tabellen und/oder anderen Objekten sind niemals an den Objektnamen gebunden. Intern wird jedes Objekt in Katalogtabellen gespeichert und die OID (interner Primärschlüssel) des Objekts wird für alles sonst verwendet.

Entsprechend ist eine FOREIGN KEY Referenz in den Katalogtabellen pg_constraint und pg_depend gespeichert. Wechselnde Tabellennamen beeinträchtigen die Funktionalität überhaupt nicht.

Der Name der Einschränkung bleibt unverändert. Sie können dies ignorieren oder die Einschränkung umbenennen, damit sie nicht irreführend ist.

Da Sie jedoch zum Zeitpunkt der Erstellung keinen Constraint-Namen angegeben haben, hat das System einen Standardwert ausgewählt, der in Ihrem Fall example2_example1fk_fkey ist, es sei denn, der Name wurde übernommen. Kein Verweis auf die referenzierte Tabelle Name. Aber der Spaltenname wird wahrscheinlich auch in Ihrem Beispiel ändern müssen. Und dass in dem Constraint-Name verwandt wird.

ALTER TABLE example2 RENAME example1fk TO example3fk; -- rename column 

In Postgres 9.2 oder höher können Sie nur die Einschränkung umbenennen auch (wie dequis commented):

ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey; 

In älteren Versionen müssen Sie die Einschränkung löschen und neu erstellen, es zu benennen, am besten in eine einzige Erklärung:

ALTER TABLE example2 -- rename constraint 
    DROP CONSTRAINT example2_example1fk_fkey 
, ADD CONSTRAINT example2_example3fk_fkey FOREIGN KEY (example3fk) 
     REFERENCES example3 (id) DEFERRABLE INITIALLY DEFERRED; 

Details in the manual.

+1

Seit Postgres 9.2 (2012) gibt es 'ALTER TABLE example2 RENAME CONSTRAINT beispiel2_example1fk_fkey TO example2_example3fk_fkey' – dequis

+0

@dequis: Guter Punkt, habe ich mit einem Verweis auf Ihren Kommentar aktualisiert. –

Verwandte Themen