Skip to content

如果要为表的主键添加 auto increment 属性,这个表的主键被作为了其他表的外键,每个表中都有数据,我不想数据丢失,那我该怎么办 :

  • 在表中添加一个新的自增长主键列,而不删除现有的主键列
    ALTER TABLE customer ADD COLUMN NewID INT AUTO_INCREMENT PRIMARY KEY FIRST;
  • 将现有的主键列的值复制到新的主键列中
    sql
    UPDATE customer SET NewID = CustomerID;
  • 对于引用了表主键的其他表,更新它们的外键引用,将其指向新的主键列 "NewID"
    sql
    ALTER TABLE other_table ADD CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customer (NewID);
  • 删除旧的主键列
    sql
    ALTER TABLE customer DROP COLUMN CustomerID;
  • 最后将“NewID”设置为主键

当 sql 文件太大时,Navicat 执行可能报错,需要修改 max_allowed_packet,当一行记录超过了 max_allowed_packet 限制的大小,将会报错。sql 文件中每次 insert 进同一张表的所有数据被称为一个数据包(packet) ,max_allowed_packet 就是来限制这个 packet 的大小的

SHOW VARIABLES LIKE 'max_allowed_packet';

// 临时修改
SET GLOBAL max_allowed_packet=1073741824; -- 1GB
SET SESSION max_allowed_packet=1073741824; -- 1GB