共计 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元/年
正文完