MySQL表中如何修改主键mysql中主键修改

记得有一次,当我维护一个旧系统时,遇到了一个奇怪的问题。
在那个系统的数据库表中,主键是自动增长的,但是有一天突然需要将主键更改为另一个字段。
我当时还年轻,数据库操作不熟练,就在迷茫中开始探索。

我首先尝试将主键字段设置为非空,但发现这并不能阻止它自动增长。
然后我尝试使用 ALTER TABLE 命令删除主键。
原来这个字段还是有一些外键限制,无法直接删除主键。
我一步步尝试,先禁用自增,然后删除主键,然后添加新主键,最后恢复自增。
这一系列的操作花了将近一个小时,亲爱的。

后来查了资料,发现其实可以在新增主键的时候指定自增,省去了恢复自增的步骤。
比如这样写: ALTER TABLE Students ADD PRIMARY KEY (sid) AUTO_INCRMENT;
现在想想,如果当时能直接查信息的话,也许就不会那么费力了。
等等,还有一件事。
突然想到现在很多数据库设计工具,比如MySQL Workbench,都带有修改主键的功能,可以直接在图形界面上操作。
真是太无忧无虑了。
不过,你还是需要了解这些命令,毕竟工具可能还不够强大。

oracle怎么修改主键

您好,当涉及到更改 Oracle 主键时,您确实必须遵循我提到的两个步骤。
不过我上次改的时候,确实拉了很多头发,所以我就详细的告诉你,免得你惹上麻烦。

---
上周有客户问我无法更改系统表的主键并报错。
后来我一看,原来他连主键的名字都不知道,就随意删除了。
那么,我们先来说说基本点:在更改之前,你必须知道原来的主键的名称!
场景1 :有一个命名主键
这个比较简单。
根据文件中所述:
1 删除原主键: ALTER TABLE table_test DROP CONSTRAINT yy; 请注意,yy 必须是您自己选择的名称。
上次将其更改为 idx_user_id 时,只需删除该名称即可。

2 添加新主键: ALTER TABLE table_test ADD CONSTRAINT new_yy PRIMARY KEY (id); 这里new_yy是新名称,id是您指定的新主键字段。
如果组合主键,例如 ID 和 Name,请添加逗号。

关键是:不要拼错你的名字!因为我看错名字了,所以把非主键约束删除了。
系统没有报错,但是桌子爆炸了……搞了好久才弄清楚。

场景 2 :没有主键命名
这有点烦人,因为 Oracle 自动提供的主键名称有时非常具有误导性。

1 .首先找到原来的主键名称: SELECT constrain_name FROM user_cons_columns WHERE tablename = 'TABLE_TEST' 并且位置不为空; 注意表名是大写的。
constraint_name 是要删除的主键的名称。
上次我把表名改成USER_INFO,结果是SYS_C007 8 8 5 ,看着很烦人。

2 删除原主键: ALTER TABLE table_test DROP CONSTRAINT SYS_C007 8 8 5 ; 使用现有名称删除。

3 添加新主键: ALTER TABLE table_test ADD PRIMARY KEY (id); 你可以直接在这里添加,也可以像情况1 一样给一个新名称,比如ADD CONSTRAINT new_pk PRIMARY KEY (id);
Bug警告:
非空约束:添加的任何主键字段必须首先非空,否则会立即报错。
上次忘记给name字段加NOT NULL,加主键就停了。

外键依赖:这是最烦人的部分!在更改主键之前,必须确保没有表通过外键链接到这些字段。
在例如,如果更改 ID 字段,其他表可能有对 user_info(id) 的 FOREIGN KEY(ref_id) 引用。
上次更改user_info表ID时,忘记检查子表。
结果主键改变后,链接表的外键立即失效,数据彻底损坏。
最后只能把备份恢复回来……(怒) 正确的做法:先删除所有依赖的外键(记得做好备份!),更改主键,然后重新添加外键。
或者使用ON DELETE CASCADE等很棒的操作,但是风险很高。


字段顺序:合并主键的字段顺序必须与原来一致,否则会出现问题。
例如,原来的主键是(ID,Name),但不能改为(Name,ID),因为约束逻辑会改变。
上次更改订单后,查询数据时出现错误。
我花了很长时间才弄清楚这是一个排序问题。

---
补充说明:主键和外键的区别其实很简单:主键是自己表中的唯一标识符,外键是与其他表关联的键。
更改主键时,如果其他表依赖于您通过外键更改的字段,则必须同步更改外键或确保数据完全一致,否则数据库会告诉您:“您的数据非法,不要为我更改!”
我有一个同事在更改主键时没有注意外键。
结果外键表里的数据全都变成空了,最后还得手动跑几千条SQL才能检索出来……真是够了。

---
无论如何,进行更改时,首先检查所有依赖关系,备份数据,确保字段不为空,并且不要随意更改顺序。
只需遵循特定流程的文档即可,但不要被细节所困惑。

如何使用navicat给数据库表添加主键和自增

上周,我的朋友使用 Navicat 给数据库表添加主键和自增。
步骤如下:
1 .连接到数据库并选择表。
打开Navicat,连接MySQL服务器,找到目标数据库,右键单击表名,选择Design Table。

2 设置主密钥。
找到主键字段,比如id,右键点击最后一列选择“主键”或者直接点击空白处。

3 分配自动增加。
选择主键字段,在属性区找到“自增”并勾选。

4 保存更改。
点击右上角“保存”,表格将被修改。

注意:主键字段必须是数字类型。
一张表只能有一个自增字段,该字段必须是主键或唯一键。
要更改或删除主键,请选择或使用 SQL 语句。

顺便说一下,我只是想到如果表中已经有数据的话,这样设置后新插入数据的主键会自动递增。
如果表中没有数据,输入后即可看到效果。
这取决于你。