主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

SQL 约束

在上一章中,我们学习了如何使用CREATE TABLE语句创建数据表,并设置各个字段的数据类型。在创建数据表时,我们看到其添加了可以自增的主键字段id,这个自增的主键就是对数据表的一种重要约束条件。

约束是指对一个或多个表字段的限制条件,用于规定该字段中能够存储的数据值类型、范围或必须满足的特定条件。作为一种标准化的数据管理机制,约束有效确保了数据库表中数据的准确性、一致性和完整性。

在 SQL 中,有几种不同类型的约束,包括:NOT NULLPRIMARY KEYUNIQUEDEFAULTFOREIGN KEYCHECK

SQL 中几种不同类型的约束


NOT NULL 约束

NOT NULL 约束用于确保某个字段在插入或更新数据时,不能存储空值NULL。这意味着该字段必须始终包含有效的数据值,如果尝试向该字段插入或更新为NULL值,数据库将拒绝操作并返回错误,导致数据保存失败。

✅ 以下是使用 SQL 创建名为users的数据表,其中 idusernamephone 三列不接受NULL值:

sql
复制
CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- MySQL 自增主键 字段不能为空
    username VARCHAR(30) NOT NULL, -- 用户名字段 不能为空
    birth_date DATE,
    phone VARCHAR(15) NOT NULL UNIQUE -- 电话字段 不能为空且唯一
);

在创建表时,仅对必须包含有效数据的字段才应添加NOT NULL约束,非必要情况下不建议随意设置。

需要注意的是,空值NULL并不等同于零、空白字符或空字符串(零长度字符串),它表示该字段 “没有值” 或 “值未知”。

✅ 以下是 EMPTY STRINGNULL0None之间的区别:

  • EMPTY STRING:默认值为一个确定的空白。插入时若省略,自动填入'',提供了安全的默认值,防止程序因漏传值而崩溃。
  • NULL:表示该字段 "没有值" 或 "值未知"。插入时若省略,自动填入NULL
  • 0:表示数值类型的零值。插入时若省略,自动填入0
  • None:不设置默认值。插入时若省略,行为由NULL约束决定(可能报错或为NULL)。

主键约束(PRIMARY KEY)

主键PRIMARY KEY约的具体功能就是确保其作用的列(或列组合)遵守以下两条不可违背的规则:

  • 唯一性约束:禁止表中任何两行在该约束所定义的列上具有相同的值。
  • 非空约束:禁止约束中的任何列接受NULL值。

数据库管理系统会持续维护这个约束。任何违反这两条规则的INSERTUPDATE操作都会被立即终止,并返回一个错误。

✅ 以下是使用 SQL 创建名为users的数据表,并将id列指定为主键:

sql
复制
CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- MySQL 自增主键
    username VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL UNIQUE
);

唯一约束(UNIQUE)

唯一约束用于保证指定列或列组合中的所有值都是唯一的,但允许存在NULL值(通常允许多个 NULL)。

UNIQUE 约束和PRIMARY KEY约束虽然都强制唯一性,但是PRIMARY KEY不允许为NULL值。

✅ 以下是使用 SQL 创建名为users的数据表,并将id列指定为主键:

sql
复制
CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL UNIQUE, -- 唯一约束,不允许为空 NULL
    email VARCHAR(50) UNIQUE -- 唯一约束,允许为空 NULL
);

值得注意的是,一个表中可以定义多个UNIQUE约束,而一个表上只能定义一个PRIMARY KEY约束。


默认约束(DEFAULT)

默认约束用于为数据表字段指定预设值。在插入新记录时,若未显式给该字段赋值,数据库将自动使用预设值进行填充。

设置默认约束的核心目的是什么?

  • 简化插入操作:无需为每个可能有常见值的字段都手动输入数据。
  • 保证数据完整性:确保即使没有提供值,该字段也不会是 NULL(除非默认值就是 NULL),而是有一个合理的、有意义的初始值。
  • 提供业务逻辑的默认行为:例如,订单的创建日期默认为当前时间,用户的状态默认为 “未激活” 等。

✅ 以下是使用 SQL 创建名为users的数据表,并为languagestatus列设定默认值:

sql
复制
CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL UNIQUE,
    language VARCHAR(10) DEFAULT 'en', -- 默认语言为英文 (en)
    status TINYINT(1) DEFAULT 0 -- 默认状态为 0 (未激活)
);

外键约束(FOREIGN KEY)

外键(Foreign Key, FK)是一种数据库约束,定义为表中引用另一表主键的一个或多个列。其核心功能在于实施引用完整性,以强制维护表间数据的逻辑关系。

✅ 假设我们有两个表:用户表 (users) 和 订单表 (orders):

1. 用户表 (users) - 主表

user_id (主键) username email website_url
10918 Alice alice@kaicz.com www.kaicz.com
10919 Bob bob@kaicz.com www.google.com
10920 Charlie charlie@kaicz.com www.alibaba.com

2. 订单表 (orders) - 从表

order_id (主键) order_date amount user_id (外键)
2025090100015 2025-09-01 99.99 10918
2025090200016 2025-09-02 50.00 10919
2025090300017 2025-09-03 25.50 10918

✅ 在 MySQL 中,您可以创建订单表 (orders) 表时,通过FOREIGN KEY外键约束来创建外键。SQL 语句如下:

sql
复制
-- 创建订单表 (从表),并添加外键约束
CREATE TABLE orders (
    order_id BIGINT PRIMARY KEY,
    order_date DATE NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(user_id) -- 外键约束,引用 users 表的 user_id 列
);

检查约束(CHECK)

CHECK 约束用于限制数据库表中某一列(或一组列)所能接受的数值范围。

例如,可以创建一个CHECK约束,将薪水(Salary)列的值限制在 3,000 至 10,000 的有效范围内,从而防止录入超出正常标准的工资数据。SQL 语句如下:

sql
复制
-- 创建订单表 (从表),并添加外键约束
CREATE TABLE orders (
    order_id BIGINT PRIMARY KEY,
    order_date DATE NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    salary INT NOT NULL CHECK (salary >= 3000 AND salary <= 10000),
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(user_id) -- 外键约束,引用 users 表的 user_id 列
);


评论区 0
发表评论
教程介绍
SQL 是一种专门用来与数据库沟通、管理和操作关系型数据库的标准化编程语言。
6 章节
71 阅读
0 评论