如何将MySQL中sample_tag表的两个外键设为联合主键?
问题解答
可以在不新建表的前提下,将sample_id和tag_id设为联合主键,但必须先清理表中重复的(sample_id, tag_id)组合记录——因为MySQL的主键约束要求字段组合必须唯一,现有重复记录会导致主键创建失败。
步骤1:清理重复记录
首先需要找出并删除重复的记录,以下提供几种可行的SQL方案:
方案1:查看重复项(可选)
先确认哪些组合存在重复:
SELECT sample_id, tag_id, COUNT(*) AS 重复次数 FROM sample_tag GROUP BY sample_id, tag_id HAVING COUNT(*) > 1;
方案2:删除重复记录(MySQL 8.0+适用)
保留每组重复记录中的第一条,删除其余:
DELETE t1 FROM sample_tag t1 JOIN ( SELECT sample_id, tag_id, ROW_NUMBER() OVER (PARTITION BY sample_id, tag_id ORDER BY sample_id) AS 行号 FROM sample_tag ) t2 ON t1.sample_id = t2.sample_id AND t1.tag_id = t2.tag_id WHERE t2.行号 > 1;
方案3:低版本MySQL兼容方案
如果你的MySQL版本低于8.0(不支持窗口函数),可以用临时表中转(临时表不属于新建正式表,符合要求):
-- 创建临时表存储唯一的组合 CREATE TEMPORARY TABLE temp_unique_tags SELECT DISTINCT sample_id, tag_id FROM sample_tag; -- 清空原表 TRUNCATE TABLE sample_tag; -- 将唯一数据导回原表 INSERT INTO sample_tag (sample_id, tag_id) SELECT sample_id, tag_id FROM temp_unique_tags;
步骤2:设置联合主键
清理完重复记录后,执行以下SQL即可将两个字段设为联合主键:
ALTER TABLE sample_tag ADD PRIMARY KEY (sample_id, tag_id);
补充说明
- 如果跳过清理步骤直接创建主键,MySQL会抛出
Duplicate entry错误,提示存在重复键值。 - 在phpMyAdmin中也可以通过图形界面操作:先执行查询删除重复项,再进入表结构页面,同时选中
sample_id和tag_id字段,点击顶部的「主键」按钮完成设置,底层执行的就是上述ALTER TABLE语句。
内容的提问来源于stack exchange,提问作者Diamaudix Audio Ltd.
相关产品推荐
相关产品推荐

