1

我指的是这个 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;
4

1 回答 1

2

索引用于加速数据库中的搜索。另一方面,唯一约束对数据库中的行强制执行规则(在您的示例中,没有两行对于 'gameID, c1, c2, c3' 列具有相同的值。

您可以在 gameID 上建立索引以加快查询,例如WHERE gameID = ?. 但这并不能保证你只有 1 行,比如说 gameID = 1。如果你需要这样一个约束,那么UNIQUE你需要的是约束(对于 id 字段,主键是一个更好的选择,因为它将唯一性和索引结合在一起)。

要回答您的具体问题:

这是否意味着我不能使用 UNIQUE(gameID, c1, c2, c3) 作为约束来确保游戏中组合的唯一性?

如果你这样做,那么这些组合将在每场比赛中都是独一无二的。

这是使用 INDEX(gameID, c1, c2, c3) 的好例子吗?

如果您经常在游戏中搜索组合,这也是一个很好的示例。

于 2013-01-30T19:22:35.773 回答