我有一个包含以下列的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.
假设您已将此密钥作为主键,并且现在要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`)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59143 次 |
| 最近记录: |