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

使用多列作为mysql的唯一标识符,mysql,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 如果已经存在具有相同组id和用户id组

我有一个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

如果已经存在具有相同组id和用户id组合的行,则即使mysql查询尝试插入上述数据,也不应创建新行。有什么方法可以做到这一点吗?基本上,我试图让两列像唯一索引一样一起工作。

为此,您可以使用任何mysql编辑器(如phpmyadmin或SQLYG)创建组id和用户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
,然后重复上述命令。)

编辑:响应用户评论

对于唯一键覆盖的列,不能有多行具有相同的非空值。例如,您不能有两行,其中
组id=0,用户id=5
。0是一个值。但是,如果将一列或两列都设置为空,则可以有多行,这些行在
NULL
s的位置上是相同的。因此,您可以有两(或更多)行,其中
group\u id为NULL,user\u id=1234

但书:上述两种常用的MySQL存储引擎(MyISAM和InnoDB)都是如此。MySQL确实有存储引擎,其中
NULL
被视为唯一值,但您可能没有使用它们

如果将一列或两列都设置为空,则您的唯一键不能是主键-主键必须位于
非空的列上

假设您已将此键作为主键,现在希望在
group\u id
列中允许
NULL
。我不知道现在是什么数据类型
group\u 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`)

组id和用户id不是此表的主键有什么原因吗?它们被设置为索引,但设置为主键是否会对尝试完成任务产生影响?如果是这样,我可以将它们设为主键。是否可以使它们仅在组id!=”时作为主键/唯一键一起工作0'?+1您启发了我如何使用INSERT。。。在复制键上,当没有主键时,只有两个外键。