一 原理
MySQL 8.0 及以上,使用 ROW_NUMBER 子查询来生成新的主键,然后再更新主键。
-- 示例表和数据
CREATE TABLE my_table (
id INT PRIMARY KEY,
data VARCHAR(255)
);
INSERT INTO my_table (id, data) VALUES
(10, 'A'),
(20, 'B'),
(30, 'C');
-- 更新表中的主键为连续的
UPDATE my_table AS t1
JOIN (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS new_id
FROM my_table
) AS t2
ON t1.id = t2.id
SET t1.id = t2.new_id;
-- 查看更新后的表数据
SELECT * FROM my_table;
二 注意事项
1 数据备份:操作前务必备份数据,以防出现意外情况。
2 外键关系:如果表中存在外键关系,在更新主键时需要特别注意外键的维护。更新完主键后,可能需要手动更新外键表中的对应值。
3 并发操作:确保在更新过程中没有并发的写操作,以防数据不一致。
通过以上步骤,你可以使用 ROW_NUMBER() 函数生成连续的主键,并直接在表上更新这些值。这个方法不需要临时表,但仍需小心操作,以确保数据的一致性和完整性。
三 使用第三方工具更改主键类型
或者使用sql 语句
直接勾选主键
ALTER TABLE my_table MODIFY COLUMN id bigint auto_increment NOT NULL COMMENT '主键';