2009-06-12 153 views
3

在postgres中,我們定義了一個約束條件,它基本上允許我們將具有某個值的表中的條目數限制爲1。我們創建了這個約束:使用MYSQL條件的唯一約束

在list_group(visitor_uid)上創建唯一索引列表$ default $ uk其中list_type ='default';

這意味着唯一約束只適用於list_type ='default',以便表中每個訪問者只能有一個'默認'列表。

它看起來像MySql不支持額外的唯一約束。是否有另一種方法可以在MySQL的數據庫模式中支持這一點?

回答

2

MYSQL不支持這種類型的約束。

你應該使用存儲過程來插入數據,所以你可以做一些檢查和驗證。

爲什麼不定義你的默認爲它必須有1作爲主鍵?這樣,pk上的正常唯一約束已經足夠了。

如果沒有任何東西適合你,你也可以考慮改變你的數據模型。

0

其實它存在。大多數限制依賴於表引擎。 我認爲InnoDB支持這一點。

要做到這一點,你必須添加一個唯一索引與獨特組合:

ALTER TABLE visitor ADD UNIQUE unique_default_visitor(visitor_uid, list_type); 
+0

是的 - 不完全。你有什麼問題是,每個list_group必須爲每個訪問者提供一個唯一的list_type。我們不希望這樣。我們試圖完成的是隻允許每個訪問者擁有一個list_type ='default'的列表組。對於其他list_types,如果有重複,則無關緊要。 – harmanjd 2009-06-12 15:59:20

+1

ho,對。然後我不知道在MySQL中這樣做的方法,因爲存儲引擎不支持CHECK常量:http://forums.mysql.com/read.php?136,152474,240479#msg-240479。但是,就像codymanix說的那樣,如果在數據庫中強制執行這個規則,我寧願修改數據結構。 – 2009-06-12 16:46:15

0

我認爲你必須寫一個觸發器來檢查它。

0

我從來沒有使用MySQL,但也許你可以這樣創建一個索引:

CREATE UNIQUE INDEX list$default$uk ON list_group ((CASE WHEN list_type='default' THEN NULL ELSE visitor_uid END)); 

說明: 唯一索引不應該關心NULL值。因此,確保索引表達式對於list_type爲<>'default'的每一行都返回NULL。

0

我的兩分錢:

你爲什麼不只是創建一個列來存儲的獨特價值(也許你可以把它像is_list_type_default),另一個存儲所有的值。如果你這樣做,你可以在第一列上設置一個unique限制。