我可以在檢查約束中進行SQL子查詢嗎?檢查約束中的SQL子查詢
我有一個post
表列id, owner
我有另一個表action
的列user_id, post_id
表user
與id
post_id -> post.id
和user_id -> user.id
也post.owner -> user.id
現在我想約束post(post_id).id != user_id
列在桌上action
這怎麼可能?
我可以在檢查約束中進行SQL子查詢嗎?檢查約束中的SQL子查詢
我有一個post
表列id, owner
我有另一個表action
的列user_id, post_id
表user
與id
post_id -> post.id
和user_id -> user.id
也post.owner -> user.id
現在我想約束post(post_id).id != user_id
列在桌上action
這怎麼可能?
不支持在CHECK約束中查看當前行之外的內容。
http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html說:
指定爲列約束檢查約束應引用 該列的唯一值,而表達式表中的約束 出現可以引用多個列。
當前,CHECK表達式不能包含子查詢,也不能引用 變量,而不是當前行的列。
這個限制有很好的理由,但是如果你喜歡在繁忙的交通中乘坐獨輪車時玩火把,你可以使用函數來顛覆限制。在這種情況下不會回來咬你是難得的;相反,在觸發器代碼中執行不變量會更安全。
http://www.postgresql.org/docs/9.1/interactive/triggers.html
+1對於「通過繁忙的交通騎獨輪車玩轉熊熊燃燒的火把」:-) – 2014-02-18 05:22:54
根據[Tom Lane的評論](http://www.postgresql.org/message-id/[email protected] ),不建議對子查詢限制進行攻擊:_「CHECK意味着在隔離**中處理對行值**的約束。如果嘗試使用它來強制執行交叉行條件,那麼項目肯定會嚴重結束。 _ – Shane 2014-11-11 22:26:05
是的,這是真實的:「CHECK是爲了單獨處理行值的限制。」但是:什麼是唯一約束?它是「在繁忙的交通中騎着獨輪車時玩火把手嗎?我已經嘗試過兩種玩火炬手和獨輪車的遊戲,到目前爲止,我不可能在一個遊戲中,也可能在將來遊戲中玩遊戲。 – guettli 2017-02-07 12:20:26
它爲什麼重要,如果引用一個表中的列恰巧有一個*值*存在於另一個表?你想解決什麼問題? – SingleNegationElimination 2012-04-16 18:33:52