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

use*_*404 42 mysql

我有一个包含以下列的mysql表:

group_id
game_id
user_id
message
last_update
Run Code Online (Sandbox Code Playgroud)

我希望让这个可以不存在两排,其中GROUP_ID为行x的值等于GROUP_ID为行Y和USER_ID为行x的值的值也等于USER_ID为y行的值.

因此,例如,假设我插入以下值:

group_id = 783
game_id = 34
user_id = 29237
message = none
last_update = 11233452
Run Code Online (Sandbox Code Playgroud)

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

Ham*_*ite 88

是的,MySQL提供了执行此操作的能力.

ALTER TABLE MyTable
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`)
Run Code Online (Sandbox Code Playgroud)

我不知道你在使用这个表是什么,但听起来这个唯一的密钥可能是表的主键的强有力的候选者.主键也自动成为唯一键.如果您决定将其作为主键,请执行以下操作:

ALTER TABLE MyTable
ADD PRIMARY KEY (`group_id`, `user_id`)
Run Code Online (Sandbox Code Playgroud)

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

编辑:回复用户评论

NULL对于唯一键所涵盖的列,不能有多个具有相同非值的行.group_id = 0 AND user_id = 5例如,你不能有两行.0是一个值.但是如果你使一个或两个列都可以为空,那么你可以拥有多个与NULLs的定位完全相同的行.所以你可以有两行(或更多行)group_id IS NULL AND user_id = 1234.

Proviso:以上适用于常用的MySQL存储引擎(MyISAM和InnoDB).MySQL确实有存储引擎NULL被视为唯一值,但您可能没有使用它们.

如果您使一个或两个列可以为空,那么您的唯一键不能是主键 - 主键必须位于列上NOT NULL.

假设您已将此密钥作为主键,并且现在要NULLgroup_id列中允许.我不知道目前的数据类型group_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`)
Run Code Online (Sandbox Code Playgroud)