PostgreSQL: domyślne nazwy ograniczeń

86

Podczas tworzenia tabeli w PostgreSQL, domyślne nazwy ograniczeń zostaną przypisane, jeśli nie zostaną podane:

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

Ale użycie ALTER TABLEdo dodania ograniczenia wydaje się, że nazwa jest obowiązkowa:

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

Spowodowało to pewne niespójności w nazewnictwie projektów, nad którymi pracowałem, i powoduje pojawienie się następujących pytań:

  1. Czy istnieje prosty sposób na dodanie ograniczenia do istniejącej tabeli o nazwie, którą otrzymałoby, gdyby zostało dodane podczas tworzenia tabeli?

  2. Jeśli nie, czy należy całkowicie unikać nazw domyślnych, aby zapobiec niespójnościom?

Ian Mackinnon
źródło
3
Zasadą jest unikanie nazw domyślnych właśnie z tego powodu - kończy się to sytuacją, w której w każdym wdrożeniu ograniczenia mają różne nazwy.
Paul Tomblin

Odpowiedzi:

35

Instrukcja jest całkiem jasne, o tym ( „ tableconstraint: Ta forma dodaje nowy ograniczenie do tabeli przy użyciu tej samej składni jak CREATE TABLE. ”)

Możesz więc po prostu uruchomić:

ALTER TABLE przykład ADD UNIQUE (a, b);
koń bez imienia
źródło
5
Ach! Pomyłkowo uwzględniłem CONSTRAINTpolubienie ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);i otrzymałem błędy. Dziękuję Ci!
Ian Mackinnon
276

Standardowe nazwy indeksów w PostgreSQL to:

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

gdzie przyrostek jest jednym z następujących:

  • pkey dla ograniczenia klucza podstawowego
  • key unikalne ograniczenie
  • excl dla ograniczenia wykluczającego
  • idx dla dowolnego innego rodzaju indeksu
  • fkey dla klucza obcego
  • check dla ograniczenia Sprawdź

Standardowym sufiksem dla sekwencji jest

  • seq dla wszystkich sekwencji

Dowód twojego UNIKALNEGO ograniczenia:

UWAGA: CREATE TABLE / UNIQUE utworzy niejawny indeks „example_a_b_key” dla tabeli „example”

Frank Heikens
źródło
10
Bardzo przydatne, dzięki! Warto dodać, że klucze obce używają sufiksu, fkeya ograniczenia dotyczące kluczy obcych w wielu kolumnach wydają się obejmować tylko nazwę pierwszej kolumny.
Ian Mackinnon
1
@IanMackinnon, to powinna być najlepsza odpowiedź!
Marcio Mazzucato
Ta informacja jest złota! Możesz to potwierdzić, uruchamiając np.CREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson
6
Dokładnie odpowiedź, której szukałem, szukając w Google „konwencji nazewnictwa indeksu postgresql”
Fancy John
1
@someone ah, przepraszam, chyba miałem na myśli koniec poleceń narzędziowych E.4.3.3. To ostatnia pozycja punktora przed E.4.3.4 Typy danych: „Użyj nazw wszystkich kolumn kluczowych podczas wybierania domyślnych nazw ograniczeń dla kluczy obcych (Peter Eisentraut)”
Michael Hewson,