目录
SQL 约束简介
SQL 约束(Constraints)用于定义数据库表中的规则,确保数据的完整性、准确性和一致性。它们限制了表中数据的类型、格式、大小等要求。通过使用约束,数据库管理系统可以有效地减少错误和不一致的数据插入,提高数据质量。
SQL 支持多种类型的约束,如主键约束、外键约束、唯一约束、非空约束等。约束可以在创建表时定义,也可以在表已经存在时通过 ALTER TABLE
语句添加。
SQL 约束的类型
PRIMARY KEY(主键约束)
主键约束用于确保表中每一行数据的唯一性。主键列的值必须是唯一的,并且不能为空。一个表只能有一个主键,且主键可以由一个或多个列组成。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
在这个例子中,employee_id
是主键,确保每个员工都有一个唯一的 ID。
FOREIGN KEY(外键约束)
外键约束用于确保数据在多个表之间的引用完整性。外键列的值必须匹配另一个表的主键或唯一键。外键确保了数据的一致性,防止删除或更新被其他表引用的数据。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
在此示例中,department_id
是外键,引用 departments
表中的 department_id
列。
UNIQUE(唯一约束)
唯一约束用于确保列中的每个值都是唯一的,但与主键不同,唯一约束允许列包含空值。一个表中可以有多个唯一约束。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
在这个例子中,email
列有一个唯一约束,确保每个员工的电子邮件地址都是唯一的。
NOT NULL(非空约束)
非空约束用于确保列中的每个值不能为空。它是数据库完整性的一种常见约束,防止插入空值到某些列中。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50)
);
在这个例子中,first_name
列不能为空。
CHECK(检查约束)
检查约束用于限制列中的值,确保它们符合特定的条件。它可以用于限制数值范围、字符串长度等。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
salary DECIMAL(10, 2),
CHECK (salary > 0)
);
在此示例中,salary
列的值必须大于零。
DEFAULT(默认约束)
默认约束用于为列提供默认值。当插入数据时,如果没有为该列指定值,数据库会使用默认值。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
hire_date DATE DEFAULT CURRENT_DATE
);
在这个例子中,hire_date
列的默认值为当前日期,若插入数据时没有指定该列的值,数据库会自动填充为当前日期。
创建约束的语法
约束可以在创建表时定义,也可以在表创建后使用 ALTER TABLE
语句添加。以下是一些常见的语法:
在创建表时定义约束
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
...
[table_constraint]
);
示例:创建带约束的表
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50),
hire_date DATE,
salary DECIMAL(10, 2) CHECK (salary > 0),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
在已存在的表中添加约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name constraint_type;
例如,添加一个唯一约束:
ALTER TABLE employees
ADD CONSTRAINT unique_email UNIQUE (email);
约束的使用场景
- 数据完整性:约束确保表中的数据符合一定的规则,例如,主键确保唯一性,外键确保数据的一致性和关联性。
- 防止无效数据:使用
NOT NULL
和CHECK
约束,可以防止插入无效或不合格的数据(如空值或负值)。 - 提高数据质量:约束如
UNIQUE
和PRIMARY KEY
可以防止重复数据的插入,确保数据的质量。 - 数据库关系:外键约束用于创建数据库中的表之间的关系,确保数据的关联性,防止孤立的记录。
约束的注意事项
- 性能问题:
- 使用约束(特别是外键约束)时,可能会对性能产生影响。特别是在大表上进行插入、更新和删除时,约束的检查会增加额外的负担。
- 删除与更新行为:
- 外键约束通常需要定义删除和更新行为。常见的选项包括
ON DELETE CASCADE
(级联删除)和ON UPDATE CASCADE
(级联更新)。如果没有定义,某些数据库会阻止删除或更新被外键引用的数据。
- 外键约束通常需要定义删除和更新行为。常见的选项包括
- 不能修改已存在的约束:
- 在某些情况下,修改已存在的约束(如修改主键或外键)可能是不可行的。通常需要删除旧的约束并创建新的约束。
- 约束的顺序:
- 在创建表时,建议根据约束的依赖关系来排列约束,避免外键约束依赖的表还没有创建的情况。
发表回复