【问题标题】:Use multiple columns as unique identifier for mysql使用多列作为 mysql 的唯一标识符
【发布时间】:2010-09-26 15:51:27
【问题描述】:

我有一个包含以下列的 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组合的行,则不应创建新行。有没有办法做到这一点?基本上,我试图让两列一起工作,有点像唯一索引。

【问题讨论】:

  • group_id 和 user_id 不是这个表的主键有什么原因吗?
  • 它们被设置为索引,但设置为主要是否对尝试完成任务有影响?如果是这样,我可以将它们设为主要。

标签: mysql


【解决方案1】:

是的,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 是一个值。但是,如果您将其中一列或两列设为可为空,您可以拥有多个与NULLs 的定位相同的行。所以你可以有两行(或更多)group_id IS NULL AND user_id = 1234

附带条件:上述情况适用于常用的 MySQL 存储引擎(MyISAM 和 InnoDB)。 MySQL 确实有将 NULL 视为唯一值的存储引擎,但您可能没有使用它们。

如果您将一列或两列都设为空,那么您的唯一键不能是主键 - 主键必须位于 NOT NULL 列上。

假设您已将此键设为主键,并且您现在希望在 group_id 列中允许 NULL。我目前不知道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`)

【讨论】:

  • 是否有可能使它们仅在 group_id != '0' 时才作为主键/唯一键一起工作?
  • +1 你启发了我如何使用 INSERT ... ON DUPLICATE KEY,当没有主键时,只有两个外键。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多