MySQL 为已有联合主键不唯一的数据表添加联合主键

287次阅读
没有评论

共计 653 个字符,预计需要花费 2 分钟才能阅读完成。

在使用 MySQL 时,如果某张表一开始忘记设置联合主键,并且已经存在数据,且这些数据在逻辑上本应该唯一但实际上并不唯一,那此时想补加联合主键就会遇到报错。因为 MySQL 要求主键字段的组合值在表中必须唯一。

下面通过一个案例演示如何处理这种情况,使表结构符合预期。

演示数据:

CREATE TABLE test(
    key1 VARCHAR(255) NOT NULL,
    key2 VARCHAR(255) NOT NULL,
    other VARCHAR(255) NOT NULL
);

INSERT INTO test (key1, key2, other) VALUES
('1', '1', 'test1'),
('1', '1', 'test2'),
('1', '1', 'test3'),
('1', '2', 'test4');

此时,如果直接尝试为 key1key2 添加联合主键,会报错,提示存在重复键值。

MySQL 为已有联合主键不唯一的数据表添加联合主键

解决方案:

  1. 将每组重复数据中只保留一条,保存到临时表中
---备份数据到临时表(根据自己的情况进行排序,保留行号为1的数据)
CREATE TEMPORARY TABLE tmp AS SELECT
*
FROM
    ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY key1, key2 ) AS rn FROM test ) t
WHERE
    rn = 1;
  1. 清空原表中的数据
---删除
DELETE FROM test;
  1. 设置联合主键

MySQL 为已有联合主键不唯一的数据表添加联合主键

  1. 将清洗后的数据插回原表
---插入备份数据
INSERT INTO test (key1, key2, other)
SELECT key1, key2, other FROM tmp;
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2025-05-27发表,共计653字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Copyright © 2023-2025 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 又拍云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock