当前位置:首页 > 主机动态 > 正文

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

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

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


主键(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)

作用

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

创建规则

  1. 基础语法

    SQL中如何定义主键和外键? 第1张

    SQL中如何定义主键和外键? 第2张

    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. 主键设计原则

    SQL中如何定义主键和外键? 第3张

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

    • 外键字段类型必须与主键完全一致
    • 为外键字段创建索引(多数数据库自动创建)
    • 谨慎使用 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 标准。

0