2014-07-03 51 views
0

我有一個表是這樣的:MySQL的複合鍵,以允許單個默認記錄

ID UserID Country IsDefault 
1 7  90  0 
2 7  93  0 
3 7  95  1 
4 7  88  0 

5 8  34  0 
6 8  55  1 
7 8  27  0 
8 8  12  0 

ID是主鍵。 UserID來自用戶表。 CountryID來自國家/地區表。 IsDefault顯示哪個國家是用戶的默認國家。

是否可以只允許一個isDefault = 1用戶ID使用組合鍵? 也就是說UserId = 7的組合應該只有一個IsDefault = 1的實例。UserId 7的所有其他實例都應該有isDefault 0.同樣的,UserId 8應該只有一個默認國家。

+3

也許使用觸發器? – Fabricator

+2

爲什麼不把默認國家作爲用戶表中的字段? – wils484

+0

你們是對的。但我很好奇,如果有可能添加這樣的約束。 –

回答

0

什麼你正在尋找被稱爲部分索引過濾在SQL服務器索引),但是MySQL不支持他們即在另一個DB以下(這不會在MySQL工作)

CREATE UNIQUE INDEX yourIndexNameHere 
ON yourTableNameHere (UserID) 
WHERE IsDefault=1; 

您的選項如下

  1. 創建觸發器執行插入並可以處理你的唯一約束UPDATE語句之前,通過設置IsDefault即爲0的所有其它行爲UserID(由加工廠的建議)(這可以例如在一個UPDATE忽略當前正在更新的行和僅更新其中IsDefault實際上是1被優化)
  2. 在用戶表中添加DefaultCountry柱存儲此信息(如wils484所示)
  3. 使用與MySQL不同的數據庫。 SQL Server,PostgreSQL和SQLite能夠支持部分索引