我有一个包含两个int值的表,它们是id.这些ID本身可以在表中显示任意次数,但它们一起应该只出现一次.

Is there a way to make a pair of values unique and still allow the individual values to show up multiple times?

作为跟进,如果可能的话,这对值可以用作键吗?我目前有一个第三列,用于为我的密钥提供唯一的自动增量值.

推荐答案

这叫做复合密钥.

如果你想把你的实际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+唯一约束),但这只是个人观点.你可以在谷歌上搜索关于复合键的利弊争论.

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

EDIT

如果要在create table语句中执行此操作

对于复合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)
);

Mysql相关问答推荐

查找关联数据库表的超集

过程/别名是有点长的MySQL命令的一部分吗?

MySQL嵌套的内连接使查询变得很慢-解决方案?

MySQL工作台的编码问题

从表中 Select 具有不同顺序的列

将上传文件的存储路径放在一张表中的缺点是什么?

生成json数据并根据特定表的匹配条件进行过滤

如何在 WampServer 上重新初始化 MySQL 以允许 lower_case_table_names = 2

SQL: Select TEXT 字段的子字符串比整个值快

完全匹配 IN 子句中的所有值

分别针对每个不同的列 Select 聚合

在 where 子句中左连接多个值

在 SQL 中的 case 语句之后将新列转换为 INT

基于 3 个条件 Select 3 行的最佳 MySQL 索引和查询

MySQL在定义表的位置后抛出错误

进行 MySQL COUNT 查询

如果在表中多次发现 a 列中的相同值,则排除所有行

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

MySQL - 计算行重复的最大计数

使用 Java 通过 SSH 连接到远程 MySQL 数据库