PostgreSQL: Standardbeschränkungsnamen

85

Beim Erstellen einer Tabelle in PostgreSQL werden Standardbeschränkungsnamen zugewiesen, wenn sie nicht angegeben werden:

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

Aber mit ALTER TABLEeiner Einschränkung hinzuzufügen , er einen Namen scheint , ist zwingend notwendig:

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

Dies hat bei Projekten, an denen ich gearbeitet habe, zu Namensinkonsistenzen geführt und die folgenden Fragen aufgeworfen:

  1. Gibt es eine einfache Möglichkeit, einer vorhandenen Tabelle eine Einschränkung mit dem Namen hinzuzufügen, den sie erhalten hätte, wenn sie während der Tabellenerstellung hinzugefügt worden wäre?

  2. Wenn nicht, sollten Standardnamen vollständig vermieden werden, um Inkonsistenzen zu vermeiden?

Ian Mackinnon
quelle
3
Ich mache es zur Regel, Standardnamen nur aus diesem Grund zu vermeiden - Sie haben die Situation, dass die Einschränkungen in jeder Bereitstellung unterschiedliche Namen haben.
Paul Tomblin

Antworten:

35

Das Handbuch ist ziemlich klar darüber (" tableconstraint: Dieses Formular fügt einer Tabelle eine neue Einschränkung hinzu, die dieselbe Syntax wie CREATE TABLE verwendet. ")

Sie können also einfach ausführen:

Beispiel ALTER TABLE ADD UNIQUE (a, b);
ein Pferd ohne Name
quelle
5
Ah! Ich habe fälschlicherweise CONSTRAINTLike aufgenommen ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);und Fehler bekommen. Vielen Dank!
Ian Mackinnon
274

Die Standardnamen für Indizes in PostgreSQL sind:

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

Dabei ist das Suffix eines der folgenden:

  • pkey für eine Primärschlüsseleinschränkung
  • key für eine eindeutige Einschränkung
  • excl für eine Ausschlussbedingung
  • idx für jede andere Art von Index
  • fkey für einen Fremdschlüssel
  • check für eine Check-Einschränkung

Standard-Suffix für Sequenzen ist

  • seq für alle Sequenzen

Beweis Ihrer EINZIGARTIGEN Einschränkung:

HINWEIS: CREATE TABLE / UNIQUE erstellt den impliziten Index "example_a_b_key" für die Tabelle "example".

Frank Heikens
quelle
10
Sehr nützlich, danke! Es ist erwähnenswert, dass Fremdschlüssel das Suffix verwenden fkeyund dass mehrspaltige Fremdschlüsseleinschränkungen nur den Namen der ersten Spalte enthalten.
Ian Mackinnon
1
@ IanMackinnon, das sollte die beste Antwort sein!
Marcio Mazzucato
Diese Info ist Gold! Sie können diese bestätigen, indem Sie zBCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson
6
Genau die Antwort, nach der ich gesucht habe, als ich "Postgresql-Index-Namenskonventionen" gegoogelt habe
Fancy John,
1
@someone ah sorry, ich denke ich meinte das Ende von E.4.3.3 Utility Commands. Dies ist das letzte Aufzählungszeichen vor E.4.3.4 Datentypen: "Verwenden Sie die Namen aller Schlüsselspalten, wenn Sie Standardbeschränkungsnamen für Fremdschlüssel auswählen (Peter Eisentraut)"
Michael Hewson,