如何在SQL中设置约束?PRIMARY KEY与FOREIGN KEY详解

来源:AI智能体作者:IT小魔仙头衔:程序员
导读:本期聚焦于小伙伴创作的《如何在SQL中设置约束?PRIMARY KEY与FOREIGN KEY详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在SQL中设置约束?PRIMARY KEY与FOREIGN KEY详解》有用,将其分享出去将是对创作者最好的鼓励。

SQL约束是作用于表中字段的规则,用于限制插入、更新、删除操作的数据内容,确保数据库中的数据符合业务要求和逻辑规范。其中PRIMARY KEY和FOREIGN KEY是关系型数据库中最核心的两种约束,前者用于唯一标识表中的每一条记录,后者用于建立表与表之间的关联关系。

如何在SQL中设置约束?PRIMARY KEY与FOREIGN KEY详解

一、PRIMARY KEY主键约束

1. 主键约束的作用

PRIMARY KEY主键约束用于唯一标识表中的每一条记录,它有两个核心特性:一是唯一性,即主键字段的值在整个表中不能重复;二是非空性,即主键字段的值不能为NULL。一张表只能有一个主键,主键可以由单个字段组成,也可以由多个字段组合而成,后者称为复合主键。

2. 创建表时设置主键约束

在创建表的时候可以直接指定主键约束,以下是单字段主键的创建示例:

-- 创建用户表,将user_id设置为主键
CREATE TABLE user_info (
    user_id INT NOT NULL,
    user_name VARCHAR(50) NOT NULL,
    user_age INT,
    PRIMARY KEY (user_id)
);

如果需要设置复合主键,可以在PRIMARY KEY后指定多个字段:

-- 创建学生选课表,使用student_id和course_id作为复合主键
CREATE TABLE student_course (
    student_id INT NOT NULL,
    course_id INT NOT NULL,
    score DECIMAL(5,2),
    PRIMARY KEY (student_id, course_id)
);

3. 已有表中添加主键约束

如果表已经创建完成,需要后续添加主键约束,可以使用ALTER TABLE语句:

-- 给已有的user_info表添加主键约束,主键为user_id
ALTER TABLE user_info ADD PRIMARY KEY (user_id);

-- 给已有的student_course表添加复合主键
ALTER TABLE student_course ADD PRIMARY KEY (student_id, course_id);

4. 删除主键约束

如果需要移除表中的主键约束,同样使用ALTER TABLE语句:

-- 删除user_info表的主键约束
ALTER TABLE user_info DROP PRIMARY KEY;

二、FOREIGN KEY外键约束

1. 外键约束的作用

FOREIGN KEY外键约束用于建立两张表之间的关联关系,它指向另一张表的主键。外键约束的作用是保证参照完整性,即外键字段的值必须是其关联主表中已存在的主键值,或者是NULL(如果外键字段允许为空)。通过外键约束可以避免插入不存在的关联数据,也能防止误删除主表中被从表引用的记录。

2. 创建表时设置外键约束

以下示例创建订单表,通过外键关联到前面创建的用户表:

-- 创建订单表,order_id为主键,user_id为外键关联user_info表的user_id
CREATE TABLE order_info (
    order_id INT NOT NULL,
    user_id INT,
    order_amount DECIMAL(10,2) NOT NULL,
    order_time DATETIME NOT NULL,
    PRIMARY KEY (order_id),
    FOREIGN KEY (user_id) REFERENCES user_info(user_id)
);

外键约束还可以指定当主表记录被更新或删除时的行为,常用的行为有:

  • RESTRICT:当主表记录被引用时,禁止更新或删除主表记录,这是默认行为
  • CASCADE:当主表记录被更新或删除时,从表中对应的记录也会同步更新或删除
  • SET NULL:当主表记录被删除时,从表中外键字段的值会被设置为NULL

带行为的创建外键示例:

-- 创建订单表,外键设置级联删除和级联更新
CREATE TABLE order_info (
    order_id INT NOT NULL,
    user_id INT,
    order_amount DECIMAL(10,2) NOT NULL,
    order_time DATETIME NOT NULL,
    PRIMARY KEY (order_id),
    FOREIGN KEY (user_id) REFERENCES user_info(user_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

3. 已有表中添加外键约束

给已存在的表添加外键约束的语法如下:

-- 给已有的order_info表添加外键,关联user_info表的user_id
ALTER TABLE order_info ADD FOREIGN KEY (user_id) REFERENCES user_info(user_id);

4. 删除外键约束

删除外键约束需要先知道外键的名称,创建外键时如果没有指定名称,数据库会自动生成一个名称,可以通过查看表结构获取外键名称,再执行删除操作:

-- 假设外键名称为fk_user_id,删除order_info表的外键约束
ALTER TABLE order_info DROP FOREIGN KEY fk_user_id;

三、PRIMARY KEY与FOREIGN KEY的区别

两种约束的核心区别可以通过下表清晰对比:

对比项PRIMARY KEYFOREIGN KEY
作用唯一标识表中的每一条记录建立表与表之间的关联关系
唯一性必须唯一且非空可以重复,也可以为NULL
数量限制一张表只能有一个主键一张表可以有多个外键
关联对象关联本表的字段关联另一张表的主键字段

四、使用注意事项

1. 主键字段尽量选择和业务无关的自增字段,避免业务变更导致主键需要修改。

2. 外键约束虽然能保证数据完整性,但在高并发场景下可能会影响性能,部分业务场景会选择不在数据库层设置外键,而是在应用层实现关联校验。

3. 删除主键约束时不需要指定主键名称,因为一张表只有一个主键;删除外键约束时必须指定外键的名称。

4. 复合主键的所有字段都不能为NULL,且组合值必须唯一。

SQL约束PRIMARY_KEYFOREIGN_KEY数据库设计修改时间:2026-07-12 05:45:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。