PRIMARY KEY
定义,外键用于关联另一表的主键,使用 FOREIGN KEY REFERENCES 目标表(主键字段)
定义,关联字段数据类型必须一致。在关系型数据库设计中,主键(Primary Key) 和外键(Foreign Key) 是确保数据完整性和建立表间关联的核心机制,它们通过强制数据规则,保障业务逻辑的准确性,以下是具体实现方法与应用场景:
主键(Primary Key)
作用
唯一标识表中的每一行数据,确保数据唯一性且不允许为空(NULL
)。
创建规则
-
单字段主键(最常用)
CREATE TABLE Users ( UserID INT PRIMARY KEY, -- 直接定义主键 UserName VARCHAR(50) NOT NULL );
-
多字段联合主键
当单个字段无法唯一标识时使用:CREATE TABLE OrderDetails ( OrderID INT, ProductID INT, Quantity INT, PRIMARY KEY (OrderID, ProductID) -- 联合主键 );
外键(Foreign Key)
作用
建立表与表之间的关联,确保引用数据的存在性(参照完整性)。
创建规则
-
基础语法
CREATE TABLE Orders ( OrderID INT PRIMARY KEY, UserID INT, -- 需关联Users表的主键 OrderDate DATE, FOREIGN KEY (UserID) REFERENCES Users(UserID) -- 定义外键 );
-
外键约束动作(关键实践)
当主表数据变更时,自动处理关联数据:FOREIGN KEY (UserID) REFERENCES Users(UserID) ON DELETE CASCADE -- 主表删除时,自动删除关联订单 ON UPDATE SET NULL -- 主表主键更新时,外键设为NULL
常用选项:
ON DELETE CASCADE
:级联删除ON DELETE SET NULL
:外键置空ON UPDATE CASCADE
:同步更新
主外键关系示例
场景
用户表(主表)与订单表(从表)的关联:
-- 主表 CREATE TABLE Users ( UserID INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键 Email VARCHAR(100) UNIQUE NOT NULL ); -- 从表 CREATE TABLE Orders ( OrderID INT AUTO_INCREMENT PRIMARY KEY, UserID INT NOT NULL, Amount DECIMAL(10,2), FOREIGN KEY (UserID) REFERENCES Users(UserID) ON DELETE RESTRICT -- 阻止删除有订单的用户 ON UPDATE CASCADE -- 用户ID更新时同步订单 );
最佳实践与常见问题
-
主键设计原则
- 永远为表定义主键
- 优先使用无业务意义的自增整数(
INT AUTO_INCREMENT
/SERIAL
) - 避免使用可变更字段(如身份证号、邮箱)
-
外键注意事项
- 外键字段类型必须与主键完全一致
- 为外键字段创建索引(多数数据库自动创建)
- 谨慎使用
CASCADE
操作,避免误删数据
-
何时不用外键?
- 超大规模数据库(性能考量)
- 分布式数据库(如分库分表)
- 遗留系统改造(需应用层保证一致性)
主流数据库语法差异
数据库 | 主键创建 | 外键约束选项 |
---|---|---|
MySQL | PRIMARY KEY AUTO_INCREMENT |
支持 ON DELETE/UPDATE |
PostgreSQL | PRIMARY KEY SERIAL |
支持 ON DELETE/UPDATE |
SQL Server | PRIMARY KEY IDENTITY(1,1) |
支持 ON DELETE/UPDATE |
Oracle | PRIMARY KEY + SEQUENCE |
支持 ON DELETE CASCADE/SET NULL |
验证数据完整性
操作后检查关联是否生效:
-- 尝试插入不存在的用户ID(应失败) INSERT INTO Orders (UserID) VALUES (999); -- 删除主表用户(若存在关联订单且用RESTRICT则失败) DELETE FROM Users WHERE UserID = 1001;
通过合理使用主外键,可有效防止“脏数据”产生,保障业务数据的逻辑一致性,对于关键业务系统(如交易、医疗),强烈建议在数据库层使用外键约束,而非依赖应用逻辑。
引用说明参考关系型数据库通用标准及官方文档,包括 MySQL 8.0 Reference Manual、Microsoft SQL Server Docs、PostgreSQL 15 Documentation 中的数据完整性章节,核心概念符合 ANSI SQL 标准。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/29585.html