SQL中如何定义主键和外键?

主键用于唯一标识表中记录,使用 PRIMARY KEY 定义,外键用于关联另一表的主键,使用 FOREIGN KEY REFERENCES 目标表(主键字段) 定义,关联字段数据类型必须一致。

在关系型数据库设计中,主键(Primary Key)外键(Foreign Key) 是确保数据完整性和建立表间关联的核心机制,它们通过强制数据规则,保障业务逻辑的准确性,以下是具体实现方法与应用场景:

SQL中如何定义主键和外键?


主键(Primary Key)

作用
唯一标识表中的每一行数据,确保数据唯一性且不允许为空(NULL)。

创建规则

  1. 单字段主键(最常用)

    CREATE TABLE Users (
        UserID INT PRIMARY KEY,        -- 直接定义主键
        UserName VARCHAR(50) NOT NULL
    );
  2. 多字段联合主键
    当单个字段无法唯一标识时使用:

    CREATE TABLE OrderDetails (
        OrderID INT,
        ProductID INT,
        Quantity INT,
        PRIMARY KEY (OrderID, ProductID)  -- 联合主键
    );

外键(Foreign Key)

作用
建立表与表之间的关联,确保引用数据的存在性(参照完整性)。

创建规则

SQL中如何定义主键和外键?

  1. 基础语法

    CREATE TABLE Orders (
        OrderID INT PRIMARY KEY,
        UserID INT,  -- 需关联Users表的主键
        OrderDate DATE,
        FOREIGN KEY (UserID) REFERENCES Users(UserID)  -- 定义外键
    );
  2. 外键约束动作(关键实践)
    当主表数据变更时,自动处理关联数据:

    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更新时同步订单
);

最佳实践与常见问题

  1. 主键设计原则

    • 永远为表定义主键
    • 优先使用无业务意义的自增整数(INT AUTO_INCREMENT / SERIAL
    • 避免使用可变更字段(如身份证号、邮箱)
  2. 外键注意事项

    SQL中如何定义主键和外键?

    • 外键字段类型必须与主键完全一致
    • 为外键字段创建索引(多数数据库自动创建)
    • 谨慎使用 CASCADE 操作,避免误删数据
  3. 何时不用外键?

    • 超大规模数据库(性能考量)
    • 分布式数据库(如分库分表)
    • 遗留系统改造(需应用层保证一致性)

主流数据库语法差异

数据库 主键创建 外键约束选项
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

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月18日 12:48
下一篇 2025年6月8日 18:47

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN