2013-02-06 111 views
2

我有一張表格,我用它將兩個表格連接成一對多關係。PSQL對兩列的唯一約束

TableA 
id 
name 

TableB 
id 
name 

LinkTable 
TableA_id 
TableB_id 

基本上,TableA中的一個可以有許多TableB。很簡單。我現在的問題是要建立符合此關係艦的規則這樣的約束:

LinkTable 
TableA_id TableB_id 
1   1 
1   2 
1   3 
2   1 
2   2 
2   3 

我想創建一個唯一約束,其結合了列在一起的獨特價值。所以在上面的鏈接表中,有了這個新的約束條件,我可以

INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 4); 
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 5); 
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (2, 6); 
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (3, 1); 

With out any problems 

And if I try to insert: 

INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 1); 
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 3); 

約束會觸發,因爲已經有一行1,1和1,3。我將如何創建一個postgres約束來做到這一點?如果我爲這兩行設置了一個唯一約束,那麼我不能再有一個TableA_id相同,並且多於一個TableB_id也是如此。

解決方案是什麼?

+0

'約束會火,因爲已經有一個與1,1和1,3.'你在哪裏看到這樣的行的行? –

+0

@Ozzy - FYI,這不是PL/SQL,而是SQL。所有的DDL lk創建,更改等等都是SQL的一部分。 – Art

+0

我意識到,但我指定psql incase有一個psql獨特的方式來編寫一個唯一的約束。更安全,然後對不起:) – Ozzy

回答

5

您是否嘗試將兩個列設置爲唯一?

ALTER TABLE LinkTable 
ADD CONSTRAINT LinkTable_Unique UNIQUE (TableA_id, TableB_id); 
+0

謝謝,按預期工作:) – Ozzy

+0

不客氣':D' –

2
create table LinkTable (
    TableA_id integer REFERENCES TableA(id), 
    TableB_Id integer REFERENCES TableB(id), 
    UNIQUE(tableA_id, tableB_id) 
);