我指的是这个 SO-question。在这里,在第一个答案中,据说
UNIQUE 是指索引的所有行都必须唯一的索引。也就是说,对于该索引中的所有列,同一行可能不会与另一行具有相同的非 NULL 值。除了用于加快查询速度外,UNIQUE 索引还可用于对数据实施约束,因为数据库系统不允许在插入或更新数据时破坏这种不同的值规则。
由于我的英语不是最好的,我想知道这意味着什么,
对于该索引中的所有列,同一行的非 NULL 值可能与另一行不同
为了快速将此与我的实际问题联系起来,这是我的场景。我有三张桌子
game(gameID, ...), PK(gameID)
player(gameID, playerName, ...), PK(gameID, playerName), FK(gameID)
prop(gameID, playerName, c1, c2, c3, ...) PK(gameID, playerName), FK(gameID, playerName)
现在,连接到游戏的玩家可以选择 1-n 个道具。在这样的道具c1 - c3
中,代表扑克牌值,更准确地说是{1,2,3, ..., T, J, Q, K, A}。
三张牌的这种组合可以包含相同的值,但在游戏中只能选择一次组合。例如,玩家可以选择{2,2,3}
和{A,2,3}
,但是在该游戏中,没有其他玩家可以再次选择相同的组合。
现在回到我的序言,这三个元素c1, c2, c3
没有UNIQUE
在语句中CREATE TABLE
声明(否则示例中的第一个组合是不可能的)。这是否意味着我不能UNIQUE(gameID, c1, c2, c3)
用作约束来确保游戏中组合的唯一性?这是一个很好的例子INDEX(gameID, c1, c2, c3)
吗?在我的特定情况下使用这两种变体有什么区别?
最后CREATE TABLE
,第三张表的声明将是
create table prop(
gameID INTEGER NOT NULL,
playerName VARCHAR(25) NOT NULL,
isBB BOOLEAN NOT NULL DEFAULT FALSE,
card1 VARCHAR(1) NOT NULL,
card2 VARCHAR(1) NOT NULL,
card3 VARCHAR(1) NOT NULL,
PRIMARY KEY (gameID, playerName),
FOREIGN KEY (gameID, playerName) REFERENCES player(gameID, playerName) ON DELETE CASCADE,
UNIQUE(gameID, c1, c2, c3) /* OR INDEX(gameID, c1, c2, c3)?
)ENGINE=INNODB;