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 KEY | FOREIGN KEY |
|---|---|---|
| 作用 | 唯一标识表中的每一条记录 | 建立表与表之间的关联关系 |
| 唯一性 | 必须唯一且非空 | 可以重复,也可以为NULL |
| 数量限制 | 一张表只能有一个主键 | 一张表可以有多个外键 |
| 关联对象 | 关联本表的字段 | 关联另一张表的主键字段 |
四、使用注意事项
1. 主键字段尽量选择和业务无关的自增字段,避免业务变更导致主键需要修改。
2. 外键约束虽然能保证数据完整性,但在高并发场景下可能会影响性能,部分业务场景会选择不在数据库层设置外键,而是在应用层实现关联校验。
3. 删除主键约束时不需要指定主键名称,因为一张表只有一个主键;删除外键约束时必须指定外键的名称。
4. 复合主键的所有字段都不能为NULL,且组合值必须唯一。
SQL约束PRIMARY_KEYFOREIGN_KEY数据库设计修改时间:2026-07-12 05:45:27