You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

课堂作业数据库设计:工厂表主键选择及外键实现咨询

工厂数据库复合主键与外键实现方案

问题背景

我正在完成一项课堂作业的数据库设计,作业仅通过叙事要求自主设计,数据库包含员工和工厂实体,其中工厂以**完整地址(Full Address)**作为唯一标识,还有其他属性。我已经完成ERD建模和MySQL代码初稿,但对“完整地址”标识的处理拿不准,有两种方案:一是将地址拆分为街道号、道路、城市等字段组成复合主键;二是直接用VARCHAR类型的完整地址作为主键。原代码如下:

CREATE table factory
( address VARCHAR(100),
  yearbuilt INT,
  PRIMARY KEY (address)
);

现咨询:若采用复合主键,如何在MySQL中实现?以及如何在其他表中将其作为外键使用?


一、MySQL中复合主键的实现

把地址拆分成多个具有实际意义的字段(比如街道号、街道名称、城市、邮编),在创建factory表时将这些字段共同指定为主键即可。核心要求是这些字段的组合必须能唯一标识每个工厂,不能出现重复组合。

示例代码:

CREATE TABLE factory (
    street_num VARCHAR(20),    -- 街道号
    street_name VARCHAR(50),   -- 街道名称
    city VARCHAR(30),          -- 城市
    postal_code VARCHAR(10),   -- 邮编
    yearbuilt INT,
    -- 声明复合主键,字段顺序按实际业务逻辑排列
    PRIMARY KEY (street_num, street_name, city, postal_code)
);

你可以根据地址的实际组成调整字段(比如加上country字段),只要保证组合唯一就行。

二、在其他表中关联复合主键作为外键

当其他表(比如员工表employee)需要关联工厂时,必须在该表中包含factory复合主键的所有对应字段,然后将这些字段组合起来设置为外键,关联到factory的复合主键上。

示例代码(以员工表为例):

CREATE TABLE employee (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(50),
    -- 同步包含factory复合主键的所有字段,命名可以加前缀区分
    factory_street_num VARCHAR(20),
    factory_street_name VARCHAR(50),
    factory_city VARCHAR(30),
    factory_postal_code VARCHAR(10),
    -- 定义外键关联,字段顺序、类型必须和factory的主键完全匹配
    FOREIGN KEY (factory_street_num, factory_street_name, factory_city, factory_postal_code)
        REFERENCES factory(street_num, street_name, city, postal_code)
        ON UPDATE CASCADE    -- 主键更新时同步更新外键
        ON DELETE RESTRICT   -- 禁止删除被关联的工厂记录
);

注意事项:

  • 外键的字段数量、顺序、数据类型必须和主键完全一致,否则会触发语法错误。
  • 外键的更新/删除规则可以根据业务需求调整(比如ON DELETE SET NULL表示工厂删除时员工的关联字段设为null,前提是外键字段允许为null)。

内容的提问来源于stack exchange,提问作者yeah man12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:37:13