MySQL如何改主键_MySQL主键修改与约束调整教程

修改MySQL主键这事儿啊,得一步步来,不能瞎操作。
我给你捋捋具体咋弄。

---
一、核心步骤与操作细节
1 . 检查并处理外键依赖 得先看看有啥表依赖你现在的主键。
用这个SQL查: sql SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'your_table_name';
这一步很重要,不然改主键时外键全炸了。
比如我上次改一个表,忘了查,结果三个子表外键都断链了,整晚没睡好。

2 . 禁用或删除外键 不能直接把外键全删了,得一个个来。
比如这个子表的外键: sql ALTER TABLE child_table DROP FOREIGN KEY fk_name;
记得看fk_name是啥名字,别瞎删。

3 . 移除旧主键 如果旧主键是自增的,得先去掉自增属性: sql ALTER TABLE your_table MODIFY id INT NOT NULL; -
先移除自增 ALTER TABLE your_table DROPPRIMARY KEY; -
再删主键
我之前改表时,忘了先移除自增,结果报错说版本不兼容,真是尴尬。

4 . 调整新主键列属性 新主键得满足NOT NULL和唯一性。
数据类型也得对: sql ALTER TABLE your_table MODIFY new_id BIGINT NOT NULL;
我上次改用了BIGINT,因为INT不够用了,结果表突然变大了,当时也没想明白为啥。

5 . 添加新主键 直接加新主键,如果需要自增: sql ALTER TABLE your_table ADD PRIMARY KEY (new_id); -
纯主键 -
或带自增 ALTER TABLE your_table MODIFY new_id INT NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (new_id);
记得看ALGORITHM,特别是大表时。

6 . 恢复外键约束 外键得重新加回来,并打开检查: sql ALTER TABLE child_table ADD CONSTRAINT fk_name FOREIGN KEY (child_column) REFERENCES your_table (new_id); SET FOREIGN_KEY_CHECKS = 1 ;
我上次加外键时,忘了set这个,结果外键约束一直失效,整了半天才发现。

---
二、关键注意事项
1 . 自增主键(AUTO_INCREMENT)的特殊处理
移除属性:改前得显式去掉自增: sql ALTER TABLE your_table MODIFY new_id INT NOT NULL;
重置自增值:手动设置起始值: sql ALTER TABLE your_table AUTO_INCREMENT = 1 001 ; 我上次改表时,忘了重置自增值,结果新插入的ID全乱套了。

2 . 数据类型限制 自增列必须是INT、BIGINT这类整数类型,不能是VARCHAR。
我上次想用VARCHAR加自增,结果直接报错,哭笑不得。

3 . 大型表优化策略
OnlineDDL(MySQL 5 .6 +): sql ALTER TABLE your_table ADD PRIMARY KEY (new_id), ALGORITHM=INPLACE, LOCK=NONE; 我上次用这个,锁表就几秒钟,爽!

第三方工具(如pt-online-schema-change): sql pt-online-schema-change --alter "ADD PRIMARY KEY (new_id)" --database your_db --table your_table --execute 这个工具超好用,尤其大表时。
我上次改一个2 GB的表,不用这个得停机几小时,用了工具3 0分钟搞定。


分片与低峰期操作: 如果表超大,分片是个好办法。
我上次把一个1 0亿行的表分了三块,改起来快多了。
记得选低峰期操作,并监控性能。

---
三、风险规避与最佳实践
1 . 避免并发写入 改自增主键时,暂停插入: sql -
暂停插入 ALTER TABLE your_table DISABLE KEYS;
-
改完后恢复 ALTER TABLE your_table ENABLE KEYS;
我上次忘了暂停,结果插入ID重复了,整晚重数据搞到天亮。

2 . 依赖关系处理 自增主键被外键引用时,同步更新外键约束: sql -
先删旧外键 ALTER TABLE child_table DROP FOREIGN KEY old_fk;
-
再加新外键 ALTER TABLE child_table ADD CONSTRAINT new_fk FOREIGN KEY (child_column) REFERENCES your_table (new_id);
记得看CONSTRAINT_NAME,别加错。

3 . 架构优化 如果数据量一直涨,考虑分片或分布式数据库。
我上次表改了三次,最后发现分片更合适,现在跑得飞快。

---
结尾 总之改主键得小心,一步步来。
备份数据、测试环境走一遍,再上生产。
我混这行1 0年,改主键踩坑无数,现在就认认真真做,少出事。

mysql constraint用法

这就是坑:过度使用外键约束可能导致数据库性能下降。

别信:非空约束不是万能的,它不能阻止列值被设置为一个无效的数据类型。

别这么干:不要在经常更新的列上设置唯一约束,因为它会显著降低写操作的速度。

SQL 如何添加唯一约束列

这就是方法。
时间:5 分钟。
数字:一条ALTER TABLE语句。

实操提醒: 检查数据重复再执行。