2010-11-05 14 views
48

PostgreSQL bir tablo oluşturarak, varsayılan kısıtlama isimleri tahsis edecektir:PostgreSQL: sağlanmazsa, varsayılan kısıtlama isimleri

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

Ama bu bir ad zorunludur görünen bir kısıtlama eklemek ALTER TABLE kullanarak:

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

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

  1. Tablo oluşturma sırasında eklendiğinde, alacağı adla var olan bir tabloya kısıtlama eklemenin basit bir yolu var mı? Tutarsızlıkları önlemek için varsayılan isimlerden tamamen kaçınılmalı mı? PostgreSQL endeks hesaplamalarında

+2

Ben sadece bu nedenle varsayılan adları önlemek için bir kural yapmak - her dağıtım kısıtları farklı adlara sahip durumla sona –

cevap

18

için örtülü endeksi "example_a_b_key" yaratacak this ("tableconstraint: Bu form, CREATE TABLE olarak aynı sözdizimini kullanarak bir tabloya yeni bir kısıtlama ekler. ")

Yani basitçe çalıştırabilirsiniz:

 
ALTER TABLE example ADD UNIQUE (a, b); 
+4

Ah! Yanlışlıkla 'CONSTRAINT' gibi 'ALTER TABLE örneği EKSTRAINT UNIQUE (a, b)' yi ekleyin ve hatalar alıyorum. Teşekkür ederim! –

144

standart adları şunlardır:

  • pkey bir birincil anahtar kısıtlaması
  • key için: eki aşağıdakilerden biridir

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

    Benzersiz bir kısıtlama için

  • Bir kontrol kısıtı için bir yabancı anahtar
  • check için endeks
  • fkey başka türlü bir Dışlama kısıtlaması
  • idx için

dizileri için Standart eki

  • olduğunu Tüm sekanslar için seq
  • UNIQUE-kısıtlamasının

Kanıtı:

UYARI: manual hakkında oldukça açıktır TABLO OLUŞTURMAK/EŞSİZ tablo "Örneğin"

+8

. Çok kullanışlı, teşekkürler! Yabancı anahtarların "fkey" sonekini kullanmasına ve bu çok sütunlu yabancı anahtar kısıtlamalarının kullanılmasına ek olan değer yalnızca ilk sütun adını içerdiği görülüyor. –

+1

@IanMackinnon, Bu en iyi cevap olmalı! –

+0

Bu bilgi altındır! Bunları, ör. CREATE TABLE mytable (mycolumn numeric UNIQUE); – jmagnusson