使用多列作为mysql的唯一标识符
我有一个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组
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。。。在复制键上,当没有主键时,只有两个外键。