插件窝 干货文章 mysql 外键可以为主键吗

mysql 外键可以为主键吗

为主 这种 关系 NULL 617    来源:    2025-03-28

MySQL 外键是否可以为主键

是的,MySQL 中的外键可以同时是主键,这种设计被称为"主外键"或"标识关系(identifying relationship)"。

外键作为主键的情况

当外键作为主键时,通常出现在以下场景:

  1. 一对一关系:一个表的主键作为另一个表的主键和外键
  2. 弱实体:依赖实体的主键包含其所依赖实体的主键

示例

-- 父表
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50) NOT NULL
);

-- 子表,其中manager_id既是主键又是外键
CREATE TABLE department_managers (
    dept_id INT PRIMARY KEY,
    manager_name VARCHAR(50) NOT NULL,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

注意事项

  1. 必须满足外键约束:作为外键的列值必须在被引用表的主键中存在
  2. 不允许NULL值:因为主键不允许NULL值
  3. 性能考虑:这种设计会影响插入和删除操作的性能
  4. 级联操作:需要谨慎设置ON DELETE和ON UPDATE规则

适用场景

这种设计最适合表示强制的、一对一的关系,例如: - 用户表和用户详情表 - 订单表和订单支付表 - 部门表和部门经理表

如果关系是可选的(可能不存在关联记录),则不适合使用这种设计,因为主键不允许NULL值。