SQL 约束:确保数据完整性和一致性的关键
SQL 约束:确保数据完整性和一致性的关键
在数据库设计中,约束(Constraints) 是一种用于限制表中字段数据类型、范围、操作方式等的规则。通过约束,数据库能够保证数据的正确性、完整性和有效性,避免错误数据的插入或修改。合理的约束设计是数据库设计的核心之一,对于确保数据质量至关重要。本文将详细讲解 SQL 中的常见约束,并通过实例帮助大家理解如何在实际应用中运用这些约束。
1. SQL 约束概述
约束 是指作用于表中字段的规则,限制了存储在表中的数据。常见的 SQL 约束包括 非空约束(NOT NULL)、唯一约束(UNIQUE)、主键约束(PRIMARY KEY)、默认约束(DEFAULT)、检查约束(CHECK) 和 外键约束(FOREIGN KEY)。
通过合理使用约束,我们可以确保数据库的 数据一致性、数据完整性 和 数据有效性。让我们一一了解这些常见的约束类型。
2. 常见约束类型
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为 NULL | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一的,不重复 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 存储数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束 | 保证字段值满足某一条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
2.1 非空约束(NOT NULL)
描述:NOT NULL 约束用于确保字段值不能为 NULL,即该字段必须有有效的数据。
示例:
CREATE TABLE user_info ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL );
说明:此示例中,name 列必须填写有效的名字,不能为 NULL。这样可以确保每条记录都有一个有效的名字。
2.2 唯一约束(UNIQUE)
描述:UNIQUE 约束保证该字段的数据在整个表中是唯一的,不允许重复。常用于确保数据不重复,如邮箱地址、电话号码等。
示例:
CREATE TABLE user_info ( id INT PRIMARY KEY, email VARCHAR(100) UNIQUE );
说明:在此例中,email 列中的每个值必须唯一,这样就能保证每个邮箱地址不会重复。
2.3 主键约束(PRIMARY KEY)
描述:PRIMARY KEY 约束用于标识每一行数据的唯一性,并要求该字段的值不能为 NULL,且每一行记录的主键值必须唯一。
示例:
CREATE TABLE user_info ( id INT PRIMARY KEY, name VARCHAR(50) );
说明:在这个例子中,id 列是主键,必须唯一且非空,作为每条记录的唯一标识符。
2.4 默认约束(DEFAULT)
描述:DEFAULT 约束用于指定当插入数据时,如果未提供某个字段的值,则使用默认值。它帮助我们避免遗漏某些字段的值。
示例:
CREATE TABLE user_info ( id INT PRIMARY KEY, name VARCHAR(50), registration_date DATE DEFAULT CURRENT_DATE );
说明:如果插入数据时没有提供 registration_date 字段的值,那么数据库将自动填入当前日期作为默认值。
2.5 检查约束(CHECK)
描述:CHECK 约束用于确保字段的值符合某个条件。比如我们可以使用 CHECK 约束来限制字段值的范围或格式。
示例:
CREATE TABLE user_info ( id INT PRIMARY KEY, age INT CHECK (age >= 18) );
说明:在这个例子中,age 字段的值必须大于或等于 18,确保用户的年龄符合合法要求。
2.6 外键约束(FOREIGN KEY)
描述:FOREIGN KEY 约束用于在两张表之间建立关联,确保数据的引用完整性。外键约束保证了子表的字段值必须引用父表中一个有效的记录。
示例:
CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES user_info(id) );
说明:在此例中,orders 表中的 user_id 列引用了 user_info 表中的 id 列,确保每个订单都关联到一个有效的用户。
3. 外键约束的深度理解
3.1 外键约束的作用
外键约束在多个表之间建立了逻辑连接,确保数据的一致性。例如,在 orders 表中,user_id 外键列引用了 user_info 表的 id 列,这样每个订单都会关联到一个有效的用户。如果删除用户,则所有与该用户相关的订单也会受到影响,或者系统会根据设定的行为进行处理。
3.2 外键约束的语法
添加外键
- 方式一:在创建表时添加外键
CREATE TABLE 表名 ( 字段名 数据类型, ... [CONSTRAINT 外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名) );
- 方式二:在表创建后添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
3.3 外键约束的删除和更新行为
当父表(被引用表)中的记录发生删除或更新时,子表(引用表)中的外键字段将根据指定的行为作出响应。常见的外键约束行为如下:
行为 说明 NO ACTION 如果父表中的记录被删除或更新,首先检查子表中是否有引用该记录的外键,如果有,则不允许删除或更新。 RESTRICT 与 NO ACTION 一样,禁止删除或更新父表中被引用的记录。 CASCADE 如果父表中的记录被删除或更新,自动删除或更新子表中相应的记录。 SET NULL 如果父表中的记录被删除或更新,子表中的外键字段将被设置为 NULL(前提是外键字段允许为 NULL)。 SET DEFAULT 如果父表中的记录被删除或更新,子表中的外键字段将被设置为默认值。 示例:设置删除和更新时的行为
ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES user_info(id) ON DELETE CASCADE ON UPDATE CASCADE;
说明:在这个例子中,设置了 CASCADE 行为。如果 user_info 表中的某个用户被删除或更新,与之关联的 orders 表中的所有订单也会自动删除或更新。
4. 实际应用示例
为了帮助大家更好地理解这些约束的应用,以下是一个完整的数据库表设计实例:
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键,自动增长', name VARCHAR(50) NOT NULL UNIQUE COMMENT '姓名,不能为空且唯一', age INT CHECK (age > 0 AND age
- 方式二:在表创建后添加外键