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

要修改MySQL主键,必须先删除旧的主键约束,然后添加新的主键约束。
主要步骤包括处理外键依赖关系、删除原主键、调整新主键列属性、添加新主键、恢复外键约束等。
同时还需要注意数据类型、唯一性、自增值重置、大表的优化等。
1 . 关键步骤及操作说明 检查并处理外键依赖关系。
查找外键:通过information_schema.KEY_COLUMN_USAGE表查询引用主键的外键。
SELECTTABLE_NAME,COLUMN_NAME,CONSTRAINT_NAMEFROMinformation_schema.KEY_COLUMN_USAGEWHEREREREFERENCED_TABLE_NAME='your_table_name';禁用或删除外键:精确处理每个外键以避免全局禁用屏蔽问题。
ALTERTABLEchild_tableDROPFOREIGNKEYfk_name;删除旧的主键。
如果旧主键有 AUTO_INCRMENT 属性,必须先删除: ALTERTABLEyour_tableMODIFYidINTNOTNULL;--删除自增 ALTERTABLEyour_tableDROPPRIMARYKEY;调整新主键列属性确保新主键列满足NOTNULL和唯一性要求,必要时修改数据类型:​​ALTERTABLEyour_tableMODIFYnew_idBIGINTNOTNULL;添加新主键 直接添加新主键,如果需要自己添加,则添加 AUTO_INCRMENT: ALTERTABLEyour_tableADDPRIMARYKEY(new_id);要恢复外键约束,请重新添加外键并启用检查: ALTERTABLEchild_tableADDCONSTRAINTfk_nameFOREIGNKEY(child_column)Referencesyour_table(new_id);SETFOREIGN_KEY_CHECKS=1 ; 2 .主要注意 删除自增主键(AUTO_INCRMENT)的特殊处理属性:修改前需要显式删除AUTO_INCRMENT,以避免版本兼容性问题。
重置自动增量值:通过 ALTERTABLEyour_tableAUTO_INCRMENT=1 001 手动设置初始值。
数据类型限制:自增列必须是整数类型(例如INT、BIGINT),并且不能用于VARCHAR。
大表优化策略OnlineDDL:MySQL5 .6 +支持ALGORITHM=INPLACE和LOCK=NONE,减少表锁时间。
ALTERTABLEyour_tableADDPRIMARYKEY(new_id),ALGORITHM=INPLACE,LOCK=NONE;第三方工具:使用pt-online-schema-change通过触发器同步数据,实现零宕机。
pt-online-schema-change--alter "ADDPRIMARYKEY(new_id)"--databaseyour_db--tableyour_table--执行共享和非高峰期操作:将大表分成碎片,选择非高峰期执行,监控性能指标。
数据保护和回滚全量备份:操作前备份数据库,确保恢复。
测试环境验证:在非生产环境中模拟流程,验证SQL语法、数据类型匹配和外键依赖关系。
回滚计划:准备回滚SQL脚本,失败后立即恢复。
3 .风险规避和最佳实践避免并发写入:修改自增主键时,暂停并发插入表,防止ID冲突。
依赖处理:当外键引用自增主键时外键约束需要同步更新。
架构优化:如果数据量持续增长,可以考虑共享或迁移到分布式数据库,以降低单表修改的风险。
通过分阶段执行、严格测试和工具支持,可以高效完成主键修改,同时保证数据完整性和服务可用性。

MySQL自增主键知识点总结

MySQL自增主要知识点总结 1 、存储自增值 MyISAM引擎:将当前自增值存储在表数据文件中。
InnoDB引擎(5 .7 及更早版本):将当前的自增值存储在内存中。
MySQL重启时,查询表自增列的最大值+步长作为当前自增值。
InnoDB引擎(8 .0及更高版本):将自增更改日志存储在重放日志中。
重启MySQL后,根据重新注册过程恢复之前的自增值。
2 、自增值的变化执行insert语句时,如果不指定自增列值,或者指定为0或空,则插入时会填充该列中表的当前自增值,并且自增值会递增(当前自增值+步长)。
执行insert语句时,如果为自增列指定了值,则使用指定的值。
然后从当前自增值开始循环+步长,选择第一个大于指定值的值作为新的当前自增值。
例如,如果设置自动增量从1 开始,步长为1 0,则自动增量值依次为1 、1 1 、2 1 如果插入的记录的自增列值为3 7 ,则获取的下一个自增值为4 1 ,因为4 1 是2 1 之后第一个大于3 7 的自增值。
3 . 查看并设置自增值和自增步长。
检查自增值和自增步长:SHOWVARIABLESLIKE'auto_inc%';设置自动增量步长(重启MySQL后无效):SET@@auto_increment_increment=1 0;查询获取到的最后一个自增ID:SELECTlast_insert_id(); 4 、回滚事务时间歇性自增列的情况:由于每次取自增值都会改变,所以回滚事务时取的自增值不会被撤回。
因此,当发生事务回滚时,自增列将会变成虚线。
当出现唯一键冲突时:首先获取当前自增值并填充到自增列中,然后由于唯一键冲突导致插入失败。
但此时自增值发生了变化,会导致中断。
什么时候执行Insert...Select语句:如果插入多行,会批量应用自增值,但如果不使用,也会导致自增列不持久化。
比如Insert...选择插入4 行,自增列的自增值从1 开始,先申请1 ,再申请2 ,再申请3 此时一共应用了7 个自增值,但只插入了5 行数据。
表中最大自增列值为5 ,但当前自增列值为8 ,下一条插入行的自增列将为8 5 . 所有插入失败都会导致中断吗?并非所有插入失败都会导致自动增量列中断。
如果列值超出范围,将在插入之前进行检查。
此时,自增值还没有被应用,所以当前的自增值不会改变,不会发生中断。
6 . 自增列锁 自增列上的锁不是事务锁。
它在应用程序完成并收到自动增量值后立即释放,而不是等待事务提交。
MySQL 5 .0之前,自增锁是数据绑定的。
如果在insert语句中使用了自增锁,那么直到该语句执行完毕后,它才会被释放。
在MySQL 5 .1 及以后版本中,增加了一个innodb_autoinc_lock_mode配置来控制自增锁的行为: 值0:表示该策略是在MySQL 5 .0之前采用的,在语句执行后释放。
值为1 :应用程序使用后立即发出常规插入语句; Bulk Insert 语句如 Insert Multiple Values 或 Insert 语句仍然必须...Select 等待语句执行完成才能发出。
值为2 :所有增量主键的申请在使用完后自动释放。
默认值为1 7 、自动增列导致父子数据不一致 当binlog_format设置为STATMENT时,每次执行的修改的SQL数据都会记录在binlog中。
此时如果插入的数据没有指定自增列值而是使用自增,可能会出现父子数据不一致的情况。
例如,主库中事务A插入两条数据后,事务B插入一条数据并返回回来,然后事务A插入另一条数据,自增列值为4 事务A提交后,主库中的数据为1 、2 、4 与从属库同步后,执行插入语句。
列出的数据为1 、2 、3 ,父子数据不一致。
解决方案:避免自动从数据库获取自增列ID。
解决办法:插入时指定ID;将 binlog_format 设置为 ROW。
8 、Last_insert_id()问题查询最后递增的ID的值:Selectlast_insert_id();当insert语句在不同事务中执行时,返回各自事务中生成的ID。
当同一个事务中多次执行insert语句时,将返回最后一个insert语句的ID。
当SQL语句批量插入多条数据时,返回该批量插入的第一条数据的ID。