2016-09-05 16 views
0

我想在表的一列上創建一個外鍵來指向另一個表的兩列,但我似乎得到一個錯誤。SQL - 在列數不同的列上創建外鍵

這是可能的:

ALTER TABLE table_a add CONSTRAINT table_a_table_b FOREIGN KEY 
(table_a.id,false) REFERENCES table_b(table_b.id,some_boolean); 

它不應該被允許該表-A參考實體在表-B其中「some_boolean」是真實的。

回答

2

一種方式是虛擬列some_bool添加到table_afalse默認值,然後讓你的FK約束的引用都列:

create table table_a (id varchar, some_bool bool default false); 
create table table_b (id varchar, some_bool bool); 

alter table table_b add constraint table_b_unique unique(id, some_bool); 
ALTER TABLE table_a add CONSTRAINT table_a_table_b 
FOREIGN KEY (id,some_bool) 
REFERENCES table_b(id,some_bool); 
+0

表-B被頻繁使用,所以我必須在「some_bool」列添加到我想要的外鍵表-B ... –

+0

是的,它不是一個理想的解決方案的每個表:( –

0

我已經自己找到了解決辦法,但它似乎這種方式也不是'乾淨':

我已經在兩個表上創建了兩個CHECK CONSTRAINT。

CREATE FUNCTION isSomeBooleanSet(BIGINT) RETURNS BOOLEAN AS 
'select some_boolean from table_b where id = $1' 
LANGUAGE SQL IMMUTABLE 
RETURNS NULL ON NULL INPUT; 

ALTER TABLE table_a ADD CONSTRAINT 
some_boolean_true_is_not_allowed CHECK (isSomeBooleanSet(table_b_id)=false); 

CREATE OR REPLACE FUNCTION tableAReferenceToInvalidTableBEntity(BIGINT, BOOLEAN) 
RETURNS BOOLEAN 
AS 'select count(*)>1 from table_a inner join table_b on table_b.id = table_a.table_b_id where table_a.table_b_id = $1 and $2 = true;' 
LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; 

ALTER TABLE table_b add CONSTRAINT table_a_cannot_realte_to_table_b_some_boolean_set CHECK (tableAReferenceToInvalidTableBEntity(id,some_boolean)=false);