在MySQL中如何设置主键和外键

坦率地说,在MySQL中设置主键和外键实际上是一个两步过程。
添加主键,直接使用ADD PRIMARY KEY;要添加外键,必须指定主表字段和辅助表字段。
但如果操作前不小心,很容易陷入困境。

我们先来说说最重要的事情。
给表添加主键时,如果原表有主键,必须先删除它。
使用 DROPPRIMARYKEY 命令,例如运行 ALTERTABLE jingyan DROPPRIMARYKEY。
景琰桌上。
我们去年跑的一个项目中,有人忘记了这一步。
结果,MySQL 被认为已关闭,并且 ADDPRIMARYKEY 执行报告了错误。
还有一点是,主键名称默认是PRIMARY,但是有些可视化工具无法显示这一点。
在这种情况下,必须使用 ALTER TABLE jingyan ADD PRIMARY KEY (id) 带空格。
对于3 000左右的表,添加主键可以使查询速度提高1 5 %左右。

还有另一个重要的细节。
设置外键时,不能只修改一张表。
首先我们需要建立主/从表。
例如,主表的用户有一个ID,从表的订单必须与其关联。
在订单表设计界面,点击设置外键,将主表字段users.id与从表字段orders.user_id关联起来。
一开始我以为外键名随便写就可以了,后来发现我错了。
我需要给它一个描述性的名称,例如 fk_users_id。
不然如果drop了主表,从表的数据就会全部丢失,就麻烦了。

等等,还有一件事。
设置外键后,不要忘记添加ON DELETE CASCADE。
这使得从表可以在主表删除记录时自动删除记录。
否则,master和slave上的数据就会混乱。
老实说,这很令人困惑。
很多人不注意这一点。

我们建议您在操作之前备份数据,或者首先尝试使用 CREATE TABLE ... LIKE 语句克隆空表。
你认为使用自增ID作为主键还是作为唯一索引更可靠?

mysql设置主键有什么用

2 02 3 年5 月,某公司数据库中,stu_id被设置为student_primary表的主键:
唯一性:避免重复stu_id,插入stu_id=1 时出错(ERROR1 06 2 )。

效率:创建索引,提高查询速度,减少全表扫描。

关联:支持通过引用课程ID来关联课程表的外键。

正确操作:删除stu_id=2 记录,不要误删除其他数据。

标准化设计:使用唯一字段或自增整数作为主键,避免冗余。

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

修改MySQL主键比较复杂,而且该键是外键依赖。

外键的处理必须一一检查:使用表KEY_COLUMN_USAGE。
例如,检查Child_table的外键: SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME='your_table_name'; 要禁用外键,请使用 ALTER TABLE Child_table DROP FOREIGN KEY fk_name;
在删除主键之前处理增量: ALTER TABLE your_table MODIFY id INT NOT NULL;然后执行 DROPPRIMARY KEY;
新的主键列必须是 NOT NULL 并且是唯一的: ALTER TABLE your_table MODIFY new_id BIGINT NOT NULL; 添加新主键: ALTER TABLE your_table ADD PRIMARY KEY (new_id);
恢复并重建外键: ALTER TABLE Child_table ADD CONSTRAINT fk_name FOREIGN KEY (child_column) REFERENCES your_table (new_id); 不要忘记设置 FOREIGN_KEY_CHECKS=1
从自动递增主键中删除 AUTO_INCRMENT 时要小心:ALTER TABLE your_table MODIFY new_id INT NOT NULL; 重置自动增量值:ALTER TABLE your_table AUTO_INCRMENT=1 001
数据类型必须是整数:INT 或 BIGINT。

对大型表使用OnlineDDL:ALTER TABLE your_table ADD PRIMARY KEY (new_id), ALGORITHM=INPLACE, LOCK=NONE; 或者使用 pt-online-schema-change: pt-online-schema-change --alter "ADD PRIMARY KEY (new_id)" --database your_db --table your_table --execute。

数据库备份:运行前完整备份。
测试环境检查SQL语法和类型匹配。

暂停同步写入:ALTER TABLE your_table AUTO_INCRMENT=1 001 ;先暂停上市。
外键引用必须同步更新。

架构优化:考虑分区或分布式数据库。

自己掂量一下。