PostgreSQL: varsayılan kısıtlama adları


88

PostgreSQL'de bir tablo oluştururken, sağlanmamışsa varsayılan sınırlama adları atanacaktır:

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

Ancak ALTER TABLEbir kısıtlama eklemek için kullanılması , bir adın zorunlu olduğu görülüyor:

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

Bu, üzerinde çalıştığım projelerde bazı ad tutarsızlıklarına neden oldu ve aşağıdaki soruları soruyor:

  1. Mevcut bir tabloya, tablo oluşturma sırasında eklenirse alacağı adla bir kısıt eklemenin basit bir yolu var mı?

  2. Aksi takdirde, tutarsızlıkları önlemek için varsayılan adlardan tamamen kaçınılmalı mı?


3
Sadece bu nedenle varsayılan isimlerden kaçınmayı bir kural haline getiriyorum - her dağıtımda kısıtlamaların farklı isimlere sahip olduğu bir durumla karşılaşıyorsunuz.
Paul Tomblin

Yanıtlar:


36

Manuel ( "bu konuda oldukça açıktır tableconstraint: CREATE TABLE gibi Bu form aynı sözdizimini kullanarak tabloya yeni bir kısıt ekler. ")

Böylece basitçe çalıştırabilirsiniz:

ALTER TABLE örneği UNIQUE EKLE (a, b);

5
Ah! Yanlışlıkla dahil edildi CONSTRAINTgibi ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);ve hataları alıyorum. Teşekkür ederim!
Ian Mackinnon

282

PostgreSQL'deki dizinler için standart isimler şunlardır:

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

son ek aşağıdakilerden biridir:

  • pkey Birincil Anahtar kısıtlaması için
  • key Benzersiz bir kısıtlama için
  • excl Hariç tutma kısıtlaması için
  • idx herhangi bir tür indeks için
  • fkey Yabancı anahtar için
  • check Kontrol kısıtlaması için

Diziler için standart son ek

  • seq tüm diziler için

EŞSİZ kısıtlamanızın kanıtı:

DİKKAT: CREATE TABLE / UNIQUE, "example" tablosu için örtük dizin "example_a_b_key" oluşturacak


10
Çok faydalı, teşekkürler! Yabancı anahtarların soneki kullandığını fkeyve çok sütunlu yabancı anahtar kısıtlamalarının yalnızca ilk sütun adını içeriyor gibi göründüğünü eklemeye değer.
Ian Mackinnon

1
@IanMackinnon, Bu en iyi cevap olmalı!
Marcio Mazzucato

Bu bilgi altın! Bunları, örn.CREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson

6
Tam olarak "postgresql dizin adlandırma kurallarını" Google'da ararken aradığım yanıt
Fancy John,

1
@ Birisi ah üzgünüm, sanırım E.4.3.3 Utility Komutlarının sonunu kastettim. E.4.3.4 Veri Türlerinden önceki son madde imi: "Yabancı anahtarlar için varsayılan kısıtlama adlarını seçerken tüm anahtar sütunların adlarını kullan (Peter Eisentraut)"
Michael Hewson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.