MySQL主键id丢失解决方案

在MySQL中,当正式环境的数据因误操作导致主键丢失,且手动修改工作量较大时,可以使用SQL语句批量修改。文章提供了一种解决方案,包括删除主键并重新设置为自动增量,以及恢复列的默认值。适用于有备份的空表且需要恢复主键和默认值的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用场景:有备份的空表,现在某个正式环境由于误操作,数据存在,但是主键部分丢失,手动修改工作量大,可使用此方案。

SELECT
 concat('ALTER TABLE ', table_name, ' MODIFY COLUMN ', column_name, ' ', column_type,' NOT NULL FIRST,DROP PRIMARY KEY', ';' ) drop_pri_seq,
  concat( 'ALTER TABLE ', table_name, ' MODIFY COLUMN ', column_name, ' ', column_type, ' NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (', column_name, ');' ) sql_alter_table_seq 
FROM
    (
    SELECT
        t1.table_name,
        t1.auto_increment,
        t2.column_name,
				t2.column_type
    FROM
        (
        SELECT
            auto_increment,
            table_name 
        FROM
            information_schema.TABLES 
        WHERE
            table_name IN ( SELECT table_name FROM information_schema.`COLUMNS` c WHERE COLUMN_KEY = 'pri' AND EXTRA = 'auto_increment' ) 
            AND table_schema = 'sioc_3_3' 
        ) t1
    LEFT JOIN ( SELECT table_schema, table_name, column_name, column_type FROM information_schema.`COLUMNS` c WHERE COLUMN_KEY = 'pri' AND EXTRA = 'auto_increment' AND table_schema = 'sioc_3_3' ) t2 ON t1.table_name = t2.table_name 
    ) tt

table_schema :更换你自己的数据库

复制出组装拼接好的sql,运行一遍即可

默认值丢失

SELECT
    concat(
        'alter table ',
        TABLE_NAME,
        ' MODIFY COLUMN ',
        COLUMN_NAME,
				' ',
				column_type,
        ' default ',
        ( CASE WHEN LOCATE( 'varchar', COLUMN_TYPE ) = 1 THEN concat( '\'', COLUMN_DEFAULT, '\'' ) ELSE COLUMN_DEFAULT END ),
				( CASE WHEN is_nullable = 'yes' THEN concat(' NOT NULL ') else concat(' ')  END ),
				( CASE WHEN column_comment != '' THEN concat( ' COMMENT ', concat( '\'', column_comment, '\';' ) ) else concat(';')  END )       
) sql_alter_default 
FROM
    information_schema.`COLUMNS` c where    
		1 = 1 
    AND TABLE_SCHEMA = 'sioc_3_3' 
    AND COLUMN_DEFAULT IS NOT NULL 
    AND TABLE_NAME NOT LIKE 'bk_%'
### MySQL主键列重新排序 对于已经存在的表,如果希望重新排列主键列的顺序并确保其连续性和唯一性,可以采取以下方法: #### 方法一:通过删除和重建自增 ID 实现重新排序 当遇到主键编号混乱的情况时,可以通过删除原有的自增 ID 并重新创建一个新的自增 ID 来实现重新排序。具体操作如下所示[^2]。 ```sql ALTER TABLE `table_name` DROP `id`; ALTER TABLE `table_name` ADD `id` INT(11) NOT NULL FIRST; ALTER TABLE `table_name` MODIFY COLUMN `id` INT(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY(`id`); ``` 这种方法适用于不需要保留旧有主键值的情形下对整个表格进行重构。 #### 方法二:利用临时表来完成主键重置 为了更安全地处理这个问题,在执行任何更改之前建议先备份原始数据。此过程涉及创建一个具有相同结构的新表,并将现有记录复制到其中,随后移除原表再改名新表为原名称[^4]。 ```sql -- 创建新表用于存储副本 CREATE TABLE new_table LIKE old_table; -- 将所有数据迁移到新表中 INSERT INTO new_table SELECT * FROM old_table; -- 移除旧表中的主键字段 ALTER TABLE new_table DROP id; -- 向新表添加新的主键,设置自动增量属性并将该列为首位 ALTER TABLE new_table ADD id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; -- 验证无误后可删除源表 DROP TABLE old_table; -- 更改新表名为原来的表名 ALTER TABLE new_table RENAME TO old_table; ``` 这种方式不仅能够解决主键序列错乱的问题,同时也提供了一种较为稳妥的数据迁移方案。 #### 注意事项 - 执行上述命令前务必确认已做好充分的数据备份工作以防意外丢失重要资料。 - 如果存在外键关联,则需谨慎考虑这些关系可能受到的影响。 - 对于大型生产环境下的数据库变更应提前规划好停机维护时间窗口以减少业务中断风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木一番

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值