【问题标题】:MySQL - Make a pair of values uniqueMySQL - 使一对值唯一
【发布时间】:2012-09-27 15:23:30
【问题描述】:

我有一个表,其中包含两个作为 ID 的 int 值。这些 ID 单独可以在表格中出现任意次数,但它们一起只能出现一次。

有没有办法让一对值唯一并且仍然允许单个值多次显示?

作为后续,如果可能的话,这对值可以用作键吗?我目前有一个第三列用于我的键的唯一自动增量值。

【问题讨论】:

  • 你在这里的意图是什么?保持组合的唯一性,还是需要同时使用两者来识别行?

标签: mysql composite-key unique-key


【解决方案1】:

它被称为复合键。

如果您想将实际 PK 更改为复合 PK,请使用

Alter table <your table> drop PRIMARY KEY;
Alter table <your table> drop COLUMN <your autoincremented column>;

Alter table <your table> add [constraint <constraint name>] PRIMARY KEY (<col1>, <col2>);

您也可以只添加一个唯一约束(您的 PK 将相同,并且唯一对...必须是唯一的)。

alter table <your table> add [constraint <constraint name>] unique index(<col1>, <col2>);

就个人而言,我会推荐第二种解决方案(简单的 PK + 唯一约束),但这只是个人观点。您可以在 Google 上搜索有关复合键的优缺点。

[] 之间的部分是可选的。

编辑

如果您想在创建表语句中执行此操作

对于复合pk

CREATE TABLE Test(
    id1 int NOT NULL, 
    id2 int NOT NULL,
    id3 int NOT NULL,
    PRIMARY KEY (id1, id2)
);

对于唯一索引

CREATE TABLE Test1(
    id1 int NOT NULL AUTO_INCREMENT, 
    id2 int NOT NULL,
    id3 int NOT NULL,
    PRIMARY KEY (id1),
    UNIQUE KEY (id2, id3)
);

【讨论】:

  • +1 用于指定术语复合键,这有助于像我这样的人了解这个新功能
  • 您能否在CREATE TABLE 语句中添加一个示例?
  • @RaphaëlAlthaus 我将如何做到这一点,以便在我尝试添加重复项时不会出现错误,而只是跳过我尝试添加的重复记录并转到下一个?跨度>
【解决方案2】:

试试这个:ALTER TABLE table_name ADD CONSTRAINT uc_name UNIQUE (col1,col2)

【讨论】:

  • 我在想这是一个'更好的方法'; mysql 至少会阻止意图并将其转换为 UNIQUE KEY... 与以下结果相同:ALTER TABLE panel ADD UNIQUE KEY name_label_UNIQUE (name, label);。另外,我发现您在添加时需要DROP KEYCONSTRAINT ...UNIQUE ho hum
  • @will 我不会说添加两个唯一键与唯一组合相同。两个唯一列将接受 、,然后拒绝 、 和拒绝 、,而复合键将接受所有三个项目。兴趣点 - 如果尝试按给定顺序添加项目,两者仍将接受 、。
【解决方案3】:

primary key (col1, col2) 添加到您的创建表定义中

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多