我試圖有條件地向表中插入一些數據,其中列值的每個組合只能在表中最多出現一次。該模式看起來是這樣的:具有NULL值的唯一列值組合
CREATE TABLE foobar (
id SERIAL PRIMARY KEY,
a_id INTEGER,
b_id INTEGER,
c_id INTEGER,
ident VARCHAR(32),
date_a timestamp,
date_b timestamp,
FOREIGN KEY a_id REFERENCES a (id) ON DELETE CASCADE,
FOREIGN KEY b_id REFERENCES b (id) ON DELETE CASCADE,
FOREIGN KEY c_id REFERENCES c (id) ON DELETE CASCADE));
的組合(A_ID,B_ID,C_ID,IDENT)是獨一無二的,但只爲date_a和date_b都是空行。
我希望只有在a_id,b_id,c_id,任務組合不在db中時才能插入新行。如果是這樣,它不需要做任何事情。
起初我試圖在這些列上創建一個唯一約束,但問題是允許a_id,b_id和c_id爲NULL,只要其中至少有一個不爲null即可。這破壞了獨特的約束。因爲a,b和c_id字段是外鍵,所以我不能將它們設置爲其他存根值(如-1)。
我試着玩鎖定(反對我的更好的判斷),導致在幾分鐘的測試中出現死鎖。
有沒有這個問題的標準解決方案?
你要這個邏輯作爲一種約束/觸發器(如果違反會拋出一個錯誤) ?或者你會添加到您的INSERT語句(如果違反,什麼都不做)? – PinnyM 2013-03-18 16:20:35
如果a_id,b_id和c_id可以爲null,那麼爲什麼要讓它們成爲外鍵?實際上,postgresql甚至允許這樣做嗎? – 2013-03-18 16:23:31
@DanBracuk,[絕對](http://stackoverflow.com/questions/1363887/does-a-foreign-key-referencing-pk-need-the-not-null-constraint)。 – PinnyM 2013-03-18 16:24:32