PostgreSQL: nomi di vincoli predefiniti


88

Quando si crea una tabella in PostgreSQL, i nomi dei vincoli predefiniti verranno assegnati se non forniti:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

Ma usando ALTER TABLEper aggiungere un vincolo sembra che un nome sia obbligatorio:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

Ciò ha causato alcune incongruenze nella denominazione dei progetti su cui ho lavorato e richiede le seguenti domande:

  1. C'è un modo semplice per aggiungere un vincolo a una tabella esistente con il nome che avrebbe ricevuto se aggiunto durante la creazione della tabella?

  2. In caso contrario, i nomi predefiniti dovrebbero essere evitati del tutto per evitare incongruenze?


3
Faccio una regola per evitare i nomi predefiniti proprio per questo motivo: ti ritroverai con la situazione in cui in ogni distribuzione i vincoli hanno nomi diversi.
Paul Tomblin

Risposte:


36

Il manuale è abbastanza chiaro su questo (" tableconstraint: questo modulo aggiunge un nuovo vincolo a una tabella utilizzando la stessa sintassi di CREATE TABLE. ")

Quindi puoi semplicemente eseguire:

ALTER TABLE esempio ADD UNIQUE (a, b);

5
Ah! Ho erroneamente incluso Mi CONSTRAINTpiace ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);e ho ricevuto errori. Grazie!
Ian Mackinnon

282

I nomi standard per gli indici in PostgreSQL sono:

{tablename}_{columnname(s)}_{suffix}

dove il suffisso è uno dei seguenti:

  • pkey per un vincolo di chiave primaria
  • key per un vincolo Unico
  • excl per un vincolo di esclusione
  • idx per qualsiasi altro tipo di indice
  • fkey per una chiave esterna
  • check per un vincolo Check

Il suffisso standard per le sequenze è

  • seq per tutte le sequenze

Prova del tuo vincolo UNICO:

AVVISO: CREATE TABLE / UNIQUE creerà l'indice implicito "example_a_b_key" per la tabella "example"


10
Molto utile, grazie! Vale la pena aggiungere che le chiavi esterne usano il suffisso fkeye che i vincoli di chiave esterna multi-colonna sembrano includere solo il nome della prima colonna.
Ian Mackinnon

1
@ IanMackinnon, questa dovrebbe essere la risposta migliore!
Marcio Mazzucato

Questa informazione è oro! Puoi confermarli eseguendo ad esempioCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson

6
Esattamente la risposta che stavo cercando quando cercavo su Google "convenzioni di denominazione dell'indice postgresql"
Fancy John

1
@qualcuno ah scusa, immagino volessi dire la fine di E.4.3.3 Comandi di utilità. È l'ultimo elemento del punto elenco prima di E.4.3.4 Tipi di dati: "Utilizza i nomi di tutte le colonne chiave quando si selezionano i nomi dei vincoli predefiniti per le chiavi esterne (Peter Eisentraut)"
Michael Hewson,
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.