主键是表中唯一标识每行的非空字段,外键是建立表间关联的桥梁;二者协同需满足InnoDB引擎、类型严格匹配、主表先建等规则,否则报错或失效。

想让订单表自动关联到用户信息、让学生成绩表准确指向学生档案,必须先理解主键和外键如何协同工作——主键定身份,外键建关系,二者缺一不可,且配合规则不满足就报错、不生效、查不到数据。
主键:唯一标识一行的硬性门槛
第一步:选一个字段或多个字段组合,确保每行值都不同且不能为空。【主键字段不允许为 NULL,也不允许重复,违反任一条件建表即失败】
第二步:在建表时用 PRIMARY KEY 明确声明,例如 CREATETABLE users(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50)); 这样 id 列就同时获得唯一性、非空性,并自动创建索引加速查询。
第三步:若已有表没主键,可用 ALTERTABLE users ADD PRIMARY KEY (id); 但注意:执行前必须保证 id 列无 NULL 值、无重复值,否则命令直接报错中断。
外键:建立表间联系的桥梁,但有严格前提
方法一:建表时直接定义外键
CREATETABLE orders(id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id)); 这一步要求 users 表已存在,且 id 是其主键,user_id 和 id 字段类型必须完全一致(如都是 INT UNSIGNED)。
方法二:对已有表添加外键约束
ALTERTABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
【添加外键前,orders 表中所有 user_id 值必须已在 users 表的 id 中存在,否则命令拒绝执行】
方法三:用图形化工具(如 MySQL Workbench)右键表 → Alter Table → Foreign Keys 标签页,填入从表字段、主表名、主表字段、ON DELETE/ON UPDATE 动作。这种方式会自动生成对应 SQL,但底层仍校验相同规则。
关键配合规则:不满足就断联、报错、锁操作
① 存储引擎必须是 InnoDB —— MyISAM 不支持外键,哪怕语法写对也无效。
② 外键字段与被引用主键字段的数据类型、字符集、是否为 UNSIGNED 必须逐字匹配。比如 users.id 是 BIGINT UNSIGNED,orders.user_id 写成 INT 就会报错“ERROR 1005”。
③ 主表必须先于从表创建;删除时,若从表存在依赖记录,默认 RESTRICT 模式下禁止删除主表行,必须先删从表或改用 CASCADE 级联策略。
④ 插入从表数据时,外键值必须在主表主键中真实存在,否则触发 “Cannot add or update a child row: a foreign key constraint fails” 错误。

















