主键是唯一标识表中每行的非空不重复字段,外键则建立表间关联且允许为空和重复。主键用PRIMARY KEY声明,外键通过FOREIGN KEY REFERENCES定义,并可设ON DELETE CASCADE级联删除。

你想在MySQL里准确区分主键和外键,避免建表时把user_id设成外键却忘了它本该是主键,或者误以为外键必须非空而卡在插入NULL值时报错。
主键:给每一行数据发身份证
第一步:打开MySQL客户端,执行建表语句时,用 PRIMARY KEY 明确声明哪一列是主键。
第二步:主键列必须满足两个硬性条件——【值不能重复,且不允许为NULL】。比如用户表中id字段设为主键,插入两条id=1的记录会直接报错Duplicate entry '1' for key 'PRIMARY'。
第三步:一张表只能有一个主键,但这个主键可以由多个字段联合组成(复合主键)。例如选课表中(student_id, course_id)共同作为主键,表示“某个学生选某门课”这件事不可重复。
这一步操作起来很简单,直接把文件拖进去就行。
外键:让两张表之间产生真实关联
方法一:建表时直接定义外键约束
CREATE TABLE orders (order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id));
方法二:建表后添加外键(需确保users表已存在且id列为主键)
ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id);
【外键列本身允许为NULL,也允许重复值】——这是和主键最直观的区别。比如一个用户下了5个订单,orders表里user_id会出现5次相同值;未登录用户的订单,user_id可设为NULL。
实战案例:电商系统中用户与订单的关系
① 先创建用户表,id为主键:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL);
② 再创建订单表,user_id为外键,指向users.id:
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(20), user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE);
③ 插入测试数据时注意:orders表中user_id必须是users表中真实存在的id值,否则报错ERROR 1452 (HY000): Cannot add or update a child row: a foreign key constraint fails。
④ 执行DELETE FROM users WHERE id = 1; 时,因设置了ON DELETE CASCADE,对应的所有orders记录会自动删除。
⑤ 如果没加ON DELETE CASCADE,直接删users中某条记录会失败,除非先清空该用户所有订单。

















