课堂作业数据库设计:工厂表主键选择及外键实现咨询
工厂数据库复合主键与外键实现方案
问题背景
我正在完成一项课堂作业的数据库设计,作业仅通过叙事要求自主设计,数据库包含员工和工厂实体,其中工厂以**完整地址(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
相关产品推荐
相关产品推荐

