如果要为表的主键添加 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