Aggiornamento del nome del vincolo in PostgreSQL


94

È possibile modificare il nome del vincolo in Postgres? Ho aggiunto una PK con:

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

E voglio avere un nome diverso per questo, per essere coerente con il resto del sistema. Devo eliminare il vincolo PK esistente e crearne uno nuovo? O esiste un modo "morbido" per gestirlo?

Grazie!

Risposte:


83

Per la chiave primaria, dovresti essere in grado di:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Tuttavia, ciò non funzionerà per altri tipi di vincoli. L'opzione migliore è eliminare quello vecchio e crearne uno nuovo. Assicurati di farlo all'interno di una transazione, in modo che il sistema non sia attivo senza di essa durante la ricostruzione. (E se non puoi farlo in una transazione, assicurati di creare prima quello nuovo , prima di eliminare quello vecchio)


160

Per rinominare un vincolo esistente in PostgreSQL 9.2 o più recente , puoi usare ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero potremmo rinominare più vincoli contemporaneamente, se sì, come?
Erlan

1
@Erlan è possibile ottenere l'elenco di tutti i vincoli tramite query pg_catalog, iterarlo tramite LOOPe utilizzare una query dinamica per rinominare.
Evgeny Nozdrev

2

Abbiamo scoperto che le chiavi primarie spesso sono in ritardo rispetto al nome della tabella principale. Questo script ci ha aiutato a identificare e risolvere quelli con problemi.

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';

Questo trova tutte le tabelle in cui il nome della chiave primaria non è più il pattern "predefinito" ( <tablename>_pkey) e crea uno script di ridenominazione per ciascuna.

Il limite di 58 caratteri sopra nel codice precedente serve per tenere conto della dimensione massima dei nomi dei vincoli (63 byte).

Ovviamente il senso controlla ciò che viene restituito prima di eseguirlo. Spero che sia utile per gli altri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.