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?


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

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".


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,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.