在数据库设计与管理的领域中,约束条件是维护数据完整性、准确性和一致性的核心机制,它们如同为数据表设定的规则,确保了存入数据库的数据符合预设的业务逻辑和格式要求,理解并熟练书写各类约束,是每一位数据库开发者和管理员必备的技能,本文将系统性地介绍数据库中常见的约束类型及其书写方式,帮助读者构建坚实可靠的数据库结构。
主键约束
主键约束是数据库中最重要也是最基础的约束之一,它唯一地标识表中的每一行记录,并确保其值不能为空(NOT NULL),一个表只能有一个主键,但主键可以由一个或多个列(复合主键)组成。
在创建表时定义主键,可以直接在列定义后声明,也可以在表定义的末尾声明。
语法示例:
-- 方式一:在列定义时直接指定 CREATE TABLE employees ( employee_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50) ); -- 方式二:在表定义末尾指定,便于定义复合主键 CREATE TABLE order_items ( order_id INT, product_id INT, quantity INT, PRIMARY KEY (order_id, product_id) );
对于已存在的表,可以通过 ALTER TABLE
语句添加主键。
ALTER TABLE departments ADD PRIMARY KEY (department_id);
外键约束
外键约束用于在两个表之间建立链接,强制实现引用完整性,它指向另一个表的主键,确保一个表中的外键值必须是其所引用表中已存在的值,或者为 NULL。
外键定义了“父表”(被引用的表)和“子表”(包含外键的表)之间的关系。
语法示例:
-- 创建父表 CREATE TABLE departments ( department_id INT PRIMARY KEY, department_name VARCHAR(100) NOT NULL ); -- 创建子表,并定义外键 CREATE TABLE employees ( employee_id INT PRIMARY KEY, name VARCHAR(100), department_id INT, FOREIGN KEY (department_id) REFERENCES departments(department_id) );
外键还支持级联操作,用于定义当父表记录被更新或删除时,子表记录的行为。
ON DELETE CASCADE
:当父表记录被删除时,子表中所有引用该记录的行也会被自动删除。ON UPDATE CASCADE
:当父表主键值被更新时,子表中所有引用该值的外键值也会被自动更新。ON DELETE RESTRICT
(默认行为):如果子表中有记录引用父表记录,则禁止删除父表记录。
CREATE TABLE employees ( employee_id INT PRIMARY KEY, name VARCHAR(100), department_id INT, FOREIGN KEY (department_id) REFERENCES departments(department_id) ON DELETE SET NULL -- 当部门被删除时,员工的department_id设为NULL );
唯一约束
唯一约束确保一列或多列组合中的所有值都是唯一的,但它允许有一个 NULL 值(具体行为视数据库系统而定,如 MySQL 允许多个 NULL,而 SQL Server 只允许一个),当需要保证某列信息不重复,但该列又不是主键时,唯一约束非常有用,例如用户的邮箱或手机号。
语法示例:
CREATE TABLE users ( user_id INT PRIMARY KEY, username VARCHAR(50) UNIQUE, email VARCHAR(100), CONSTRAINT uq_email UNIQUE (email) -- 使用命名约束 );
非空约束
非空约束非常简单,它强制规定某列在插入或更新记录时不能包含 NULL 值,这是保证数据质量的基本手段。
语法示例:
CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(100) NOT NULL, description TEXT ); -- 为已存在的表添加非空约束(某些数据库语法可能不同) ALTER TABLE products ALTER COLUMN description SET NOT NULL;
检查约束
检查约束用于限制列中可以接受的值的范围,它允许你定义一个布尔表达式,插入或更新的数据必须使该表达式为真,这使得复杂的业务规则可以直接在数据库层面强制执行。
语法示例:
CREATE TABLE employees ( employee_id INT PRIMARY KEY, name VARCHAR(100), age INT, salary DECIMAL(10, 2), CONSTRAINT chk_age CHECK (age >= 18), CONSTRAINT chk_salary CHECK (salary > 0) );
在上例中,chk_age
确保员工年龄不小于18岁,chk_salary
确保薪资为正数。
默认约束
默认约束为列指定一个默认值,当插入新记录时,如果没有为该列提供值,数据库会自动使用默认值填充。
语法示例:
CREATE TABLE orders ( order_id INT PRIMARY KEY, order_date DATE DEFAULT CURRENT_DATE, status VARCHAR(20) DEFAULT 'Pending' );
为了更直观地对比,下表小编总结了各类约束的核心信息:
约束类型 | 主要作用 | 典型语法示例 |
---|---|---|
主键 (PRIMARY KEY) | 唯一标识每一行,非空 | id INT PRIMARY KEY |
外键 (FOREIGN KEY) | 链接两个表,保证引用完整性 | FOREIGN KEY (dept_id) REFERENCES depts(id) |
唯一 (UNIQUE) | 保证列值唯一,允许一个NULL | email VARCHAR(100) UNIQUE |
非空 (NOT NULL) | 确保列值不能为空 | name VARCHAR(50) NOT NULL |
检查 (CHECK) | 限制列的取值范围 | CHECK (price > 0) |
默认 (DEFAULT) | 为列提供默认值 | status VARCHAR(20) DEFAULT 'Active' |
相关问答 (FAQs)
主键和唯一约束有什么根本区别?
解答: 主要区别有三点:
- 唯一性数量:一个表只能有一个主键,但可以有多个唯一约束。
- NULL 值:主键列绝对不允许为 NULL,唯一约束列通常允许包含一个 NULL 值(具体行为取决于数据库系统,如 MySQL 允许多个 NULL,而 SQL Server 只允许一个)。
- 用途:主键是表的主要标识符,通常用于建立表间关系(作为外键引用),唯一约束更多用于防止业务逻辑上的重复信息,如邮箱、身份证号等。
如何修改或删除一个已经存在的约束?
解答: 可以使用 ALTER TABLE
语句配合 DROP CONSTRAINT
子句来删除约束,如果需要修改,通常的做法是先删除旧约束,再添加新的约束。
删除约束示例:
-- 删除名为 chk_salary 的检查约束 ALTER TABLE employees DROP CONSTRAINT chk_salary;
修改约束(实际上是替换)示例:
假设我们要将 chk_age
的条件从 age >= 18
改为 age >= 21
。
-- 1. 删除旧约束 ALTER TABLE employees DROP CONSTRAINT chk_age; -- 2. 添加新约束 ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 21);
在执行这些操作时,如果约束没有命名,数据库系统会自动生成一个内部名称,你需要先查询系统表(如 information_schema
)来找到这个名称,在创建约束时显式命名是一个良好的实践。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复