使用多个列作为MySQL的唯一标识符

我有一个与以下列的MySQL表:

group_id game_id user_id message last_update 

我想这样做,以便没有两行可以存在的地方,行x的group_id的值等于行y的group_id的值,并且行x的user_id的值也等于行y的user_id的值。

所以,比如说,我插入下面的值:

 group_id = 783 game_id = 34 user_id = 29237 message = none last_update = 11233452 

即使mysql查询试图插入它,上述数据也不应该创build一个新的行,如果一行已经存在与group_id和user_id相同的组合。 有没有办法做到这一点? 基本上,我试图让两列一起工作,就像一个独特的索引。

是的,MySQL提供了这样做的能力。

 ALTER TABLE MyTable ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`) 

我不知道你在使用这个表格,但是这听起来像这个独特的关键字可能是表格主键的有力候选者。 主键也是自动唯一的键。 如果您决定将其作为主键,请执行以下操作:

 ALTER TABLE MyTable ADD PRIMARY KEY (`group_id`, `user_id`) 

(如果您收到错误消息,说明已有主键,则发出ALTER TABLE MyTable DROP PRIMARY KEY ,然后重复上述命令。)

编辑:回应用户评论

对于唯一密钥所覆盖的列,不能有多个具有相同非NULL值的行。 所以你不能有两行, group_id = 0 AND user_id = 5 。 0是一个值。 但是,如果您使一个或两个列可以为空,则可以有多个与定位NULL相同的行。 所以你可以有两个(或更多)行group_id IS NULL AND user_id = 1234

Proviso:对于常用的MySQL存储引擎(MyISAM和InnoDB)来说都是如此。 MySQL确实有存储引擎,其中NULL被认为是一个独特的价值,但你可能没有使用它们。

如果您将一列或两列都设为可空,那么您的唯一键不能是主键 – 主键必须在NOT NULL列上。

假设您已将此键设为主键,并且您现在要在group_id列中允许NULL 。 我不知道现在是什么数据typesgroup_id ; 我会假设它目前是INT UNSIGNED NOT NULL ,但是如果不是这样,你将不得不修改下面的内容。 你将不再能够使用这个键作为你的主键。 以下是您可以执行所需更改的命令:

 ALTER TABLE MyTable DROP PRIMARY KEY, MODIFY group_id INT UNSIGNED, ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`) 

那么你可以用phpmyadmin或sqlyog等任何mysql编辑器创buildgroup_id和user_id的组合键,并将其标记为唯一索引。