共计 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'); |
此时,如果直接尝试为 key1
和 key2
添加联合主键,会报错,提示存在重复键值。
解决方案:
- 将每组重复数据中只保留一条,保存到临时表中
---备份数据到临时表(根据自己的情况进行排序,保留行号为1的数据) | |
CREATE TEMPORARY TABLE tmp AS SELECT | |
* | |
FROM | |
( SELECT *, ROW_NUMBER() OVER ( PARTITION BY key1, key2 ) AS rn FROM test ) t | |
WHERE | |
rn = 1; |
- 清空原表中的数据
---删除 | |
DELETE FROM test; |
- 设置联合主键
- 将清洗后的数据插回原表
---插入备份数据 | |
INSERT INTO test (key1, key2, other) | |
SELECT key1, key2, other FROM tmp; |
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完