Aktualisierung des Einschränkungsnamens in PostgreSQL

87

Ist es möglich, den Einschränkungsnamen in Postgres zu ändern? Ich habe eine PK hinzugefügt mit:

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

Und ich möchte einen anderen Namen dafür haben, um mit dem Rest des Systems konsistent zu sein. Soll ich die vorhandene PK-Einschränkung löschen und eine neue erstellen? Oder gibt es eine "weiche" Möglichkeit, dies zu verwalten?

Vielen Dank!

Milen A. Radev
quelle

Antworten:

81

Für den Primärschlüssel sollten Sie nur Folgendes können:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Dies funktioniert jedoch nicht für andere Arten von Einschränkungen. Die beste Option besteht darin, die alte zu löschen und eine neue zu erstellen. Stellen Sie sicher, dass Sie dies innerhalb einer Transaktion tun, damit das System während der Wiederherstellung nicht ohne sie lebt. (Und wenn Sie dies in einer Transaktion nicht tun können, müssen Sie zuerst die neue erstellen , bevor Sie die alte löschen.)

Magnus Hagander
quelle
150

Um eine vorhandene Einschränkung in PostgreSQL 9.2 oder höher umzubenennen , können Sie ALTER TABLE verwenden :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
Arturo Herrero
quelle
1
@ArturoHerrero könnten wir mehrere Einschränkungen gleichzeitig umbenennen, wenn ja, wie?
Erlan
1
@Erlan Sie können die Liste aller Einschränkungen per Abfrage an pg_catalogabrufen, über iterieren LOOPund eine dynamische Abfrage zum Umbenennen verwenden.
Evgeny Nozdrev
0

Wir haben festgestellt, dass Primärschlüssel häufig hinter dem Namen der Haupttabelle zurückbleiben. Dieses Skript hat uns geholfen, diejenigen mit Problemen zu identifizieren und zu beheben.

select 
    table_name, 
    constraint_name , 
    'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type  = 'PRIMARY KEY' 
and constraint_name <> left(table_name, 58) || '_pkey';

Dadurch werden alle Tabellen gefunden, in denen der Primärschlüsselname nicht mehr das "Standard" -Muster ist (<tablename>_pkey ) ist, und es wird jeweils ein Umbenennungsskript erstellt.

Die oben im obigen Code angegebene Beschränkung von 58 Zeichen dient zur Berücksichtigung der maximalen Größe von Einschränkungsnamen (63 Byte).

Offensichtlich sinnvoll prüfen, was zurückgegeben wird, bevor es ausgeführt wird. Hoffe das ist hilfreich für andere.

Paul Grimshaw
quelle