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

时间:2010-09-26 15:51:27

标签: mysql

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

group_id
game_id
user_id
message
last_update

我想这样做,以便不存在两行,其中行x的group_id的值等于行y的group_id的值,而行x的user_id的值也等于user_id的值。排y。

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

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

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

2 个答案:

答案 0 :(得分:87)

是的,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的列上。

假设您已将此密钥设为主键,现在希望在NULL列中允许group_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`)

答案 1 :(得分:0)

为此,您可以使用任何mysql编辑器(如phpmyadmin或sqlyog)创建group_id和user_id的复合键,并将其标记为唯一索引。