当前位置:首页 > 问答 > 正文

怎么把SQL里那个自动增长的主键给删了,步骤啥的讲讲吧

下面我分两种最常见的情况,用最白的话给你讲讲步骤,一种是MySQL,另一种是SQL Server。

在MySQL里操作

假设你有个表叫 users,里面有个主键字段叫 id,它现在是自己往上增长的。

第一步:备份!备份!备份! 千万别嫌我啰嗦,动数据库主键这种核心结构之前,一定要先备份你的数据,万一弄错了,数据全乱套或者丢了,哭都来不及,你可以用数据库管理工具(比如phpMyAdmin)导出一份SQL文件,或者直接在命令行用 mysqldump 命令备份整个数据库,这是保命的步骤,不能省。

第二步:搞清楚表长啥样 你得先看清楚这个表的结构,可以执行下面这个命令看看:

DESCRIBE users;

或者更详细一点的:

SHOW CREATE TABLE users;

从结果里,你要看清楚除了 id 这个主键,还有其他什么字段,name, age 之类的,心里有个数。

第三步:把自动增长的特性去掉(核心步骤) 这里的关键是,你不能直接修改现有的主键字段去掉自动增长,你得先把这个主键约束给删了,然后重新定义一个不带自动增长的同名字段,但删主键约束的前提是,不能有别的表通过外键指着这个主键(这叫外键约束),如果有,你得先把那些外键约束删掉,我们这里假设没有外键约束,最简单的情况。

步骤如下:

  1. 先删除主键约束。 注意,只是删除了“主键”这个身份,id 这个字段和里面的数据都还在。

    ALTER TABLE users DROP PRIMARY KEY;
  2. 修改 id 字段,去掉AUTO_INCREMENT属性。 这时候 id 就是一个普通的整数字段了。

    ALTER TABLE users MODIFY id INT;

    这里的 INT 要换成你原来字段的类型,比如可能是 BIGINT

    怎么把SQL里那个自动增长的主键给删了,步骤啥的讲讲吧

第四步:(如果需要)重新建立主键 如果你只是不想让它自动增长,但还是希望 id 字段作为主键(只是需要手动管理它的值),那你现在可以把它重新设为主键,但这次不加AUTO_INCREMENT。

ALTER TABLE users ADD PRIMARY KEY (id);

这样操作之后,id 字段依然是主键,但它不会再自动生成数字了,你需要自己插入数据的时候给它赋值。

第五步:检查一下 操作完成后,再用 DESCRIBE users; 看看表结构,确认 id 字段的 Key 那一栏是 PRI(表示是主键),但 Extra 那一栏已经没有 auto_increment 了。

在SQL Server里操作

SQL Server里管自动增长叫IDENTITY,思路和MySQL几乎一模一样,但语法差别很大。

第一步:同样,备份数据! 这个不管在哪个数据库里都是铁律。

第二步:查看表结构 可以用SQL Server Management Studio (SSMS) 的图形界面直接看,或者写查询:

怎么把SQL里那个自动增长的主键给删了,步骤啥的讲讲吧

SP_HELP 'users';

第三步:去掉IDENTITY属性 这一步在SQL Server里更麻烦一点,因为它不允许直接用ALTER COLUMN语句去掉IDENTITY属性,常用的方法是:

  1. 创建一个新的、不带IDENTITY属性的临时字段。 比如叫 new_id

    ALTER TABLE users ADD new_id INT;
  2. 把原来 id 字段的数据复制到新字段里。

    UPDATE users SET new_id = id;
  3. 删除旧的 id 字段。

    ALTER TABLE users DROP COLUMN id;
  4. 把新的 new_id 字段重命名为 id,并设为主键。

    EXEC SP_RENAME 'users.new_id', 'id', 'COLUMN';
    ALTER TABLE users ALTER COLUMN id INT NOT NULL;
    ALTER TABLE users ADD PRIMARY KEY (id);

    这一串操作相当于给表做了一次“换身份证”的手术。

重要提醒和总结

  • 数据会乱吗? 按照上面的步骤,如果只是去掉自动增长但保留主键约束,表里的现有数据是不会乱的,顺序和关系都在,但如果你在去掉自动增长后,自己插入数据时忘了给主键赋值,或者赋了重复的值,那就会报错,因为主键不允许重复和为空。
  • 为啥要这么干? 有人这么做可能是因为业务上需要导入一批已有固定ID的数据,不希望系统自己分配;或者想把主键改成其他类型(比如UUID);又或者是为了数据迁移。
  • 最省事的方法: 如果表里还没什么数据,或者你不怕麻烦,最干脆的方法是:①备份数据;②把整个表删了(DROP TABLE);③重新创建一个结构一模一样、只是不带AUTO_INCREMENT/IDENTITY的表,但这通常是下策。

动主键是个精细活儿,一定要在测试环境先练习熟练了,确认没问题再对重要的生产数据库下手,希望这些大白话的步骤能帮到你。