Postgresql'de, iki sütunun birleşiminde benzersiz kuvvet


192

PostgreSQL'de iki sütunun birlikte benzersiz olması gereken bir tablo oluşturmak istiyorum. Her ikisini birden paylaşan iki değer olmadığı sürece, her iki değerin birden çok değeri olabilir.

Örneğin:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

Yani, col1ve col2fakat aynı zamanda, tekrarlayabilirsiniz. Yani, buna izin verilecekti (id dahil değil)

1 1
1 2
2 1
2 2

ama bu değil:

1 1
1 2
1 1 -- would reject this insert for violating constraints

Bu google'da bir üst sıra arama sonucu olduğundan, belki de var tabloyu değiştirmek daha iyi
ϻαϻɾΣɀО-MaMrEzO

Yanıtlar:


228
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrementpostgresql değil. Sen istiyorsun serial.

Eğer col1 ve col2 benzersizdir ve boş olamazsa, iyi bir birincil anahtar yaparlar:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)

6
Burada benzersiz bir birincil anahtar önerisini seviyorum, çünkü bu durumda NULL değerlere izin vermiyoruz. PostgeSQL dokümanlarından: "Benzersiz bir kısıtlamanın, kendiliğinden, boş değerleri hariç tutmadığı için benzersiz bir tanımlayıcı sağlamadığını unutmayın.)" Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

Bunu şema tanımında nasıl uygulayabilirim?
18'de

2
Bazı senaryolarda, bir yedek anahtarın sütun birleşimi yerine birincil anahtar olarak kullanılmasını isteyebilirsiniz. Özellikle büyük veri hacimlerinde birleştirmeler yaparken performansı artırmak için. Şahsen aşağıdaki BENZERSİZ SÖZLEŞME çözümüne gittim.
Alexis.Rolland

1
Benzersiz (col1, col2 = '1') gibi tek bir permütasyonda benzersiz bir kısıtlama uygulamak mümkün müdür?
Vikram Khemlani


160

İki sayının birlikte tekrarlanamayacağı benzersiz bir kısıtlama oluşturun:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

Normal EŞSİZ KISIT gibi görünüyor :)

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

Daha fazlası burada


1
Bu bağımsız olarak aiçin bir dizin ve için bir dizin ekliyor mu c? Çünkü abazen dayanarak hızlı bir şekilde bulmam ve bazen dayanarak hızlı bir şekilde bulmam gerekiyor c.
CMCDragonkai
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.