SQL 约束(Constraints)详解
SQL 约束(Constraints)详解
在数据库设计中,约束(Constraints)是确保数据完整性和一致性的关键机制。本文将详细介绍SQL中常见的几种约束类型,包括NOT NULL、PRIMARY KEY、UNIQUE、DEFAULT、FOREIGN KEY和CHECK等,通过具体的示例代码帮助读者理解其使用场景和方法。
什么是约束?
约束是对表的一个或多个列的限制,用于控制可以存储在该列中的值的类型。约束提供了一种标准机制来维护数据库表内数据的准确性和完整性。
SQL中有以下几种不同类型的约束:
- NOT NULL约束
- 主键约束(PRIMARY KEY)
- 唯一约束(UNIQUE)
- 默认约束(DEFAULT)
- 外键约束(FOREIGN KEY)
- 检查约束(CHECK)
让我们详细讨论每个约束。
NOT NULL约束
NOT NULL约束指定列不接受NULL值。这意味着,如果NOT NULL对列施加约束,那么您必须在表中插入新行时不为该列添加NULL值。
以下SQL语句创建一个名为persons
的表,该表有四列,其中三列id
、name
和phone
不接受NULL值。
CREATE TABLE persons (
id INT NOT NULL,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL
);
注意:空值或NULL不同于零,空白或长度为零的字符串,例如''。NULL表示尚未输入。
主键约束(PRIMARY KEY)
PRIMARY KEY约束标识具有唯一标识表中行的值的列。表中的任何两行都不能具有相同的主键值。同样,您不能在主键列中输入NULL值。
以下SQL语句创建一个名为persons
的表,并将id
列指定为主键。这意味着该字段不允许NULL或重复值。
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL
);
提示:主键通常由一个表中的一列组成,但是可以由多个列组成该主键,例如,员工的电子邮件地址或分配的标识号是员工表的逻辑主键。
唯一约束(UNIQUE)
UNIQUE约束限制一个或多个列在表中包含唯一值。
尽管UNIQUE约束和PRIMARY KEY约束都强制唯一性,但当您要强制列或列组合(而不是主键)的唯一性时,请使用UNIQUE约束而不是PRIMARY KEY约束。
以下SQL语句创建一个名为persons
的表,并将phone
列指定为unique。这意味着该字段不允许重复值。
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE
);
注意:可以在一个表上定义多个UNIQUE约束,而在一个表上只能定义一个PRIMARY KEY约束。而且,与PRIMARY KEY约束不同,UNIQUE约束允许NULL值。
默认约束(DEFAULT)
DEFAULT约束指定列的默认值。列的默认值是当INSERT语句未显式分配特定值时,数据库引擎将在列中插入的某个值。
以下SQL语句为“国家/地区”列创建一个默认值。
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE,
country VARCHAR(30) NOT NULL DEFAULT 'Australia'
);
注意:如果将表列定义为NOT NULL,但为该列分配一个默认值,则在INSERT语句中无需为该列显式分配一个值即可在表中插入新行。
外键约束(FOREIGN KEY)
外键(FK)是一列或列的组合,用于在两个表中的数据之间建立和加强关系。
这是显示雇员(employees)和部门(departments)表之间关系的示例图。如果仔细查看,您会注意到employees表的dept_id列与departments表的主键列匹配。因此,dept_id为的列名员工表的外键的部门表。
在MySQL中,您可以如下创建FOREIGN KEY表时通过定义约束来创建外键。以下语句在employees表的dept_id列上建立一个外键,该外键引用departments表的dept_id列。
CREATE TABLE employees (
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR(55) NOT NULL,
hire_date DATE NOT NULL,
salary INT,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
检查约束(CHECK)
CHECK约束用于限制可以放置在列中的值。
例如,可以通过创建一个CHECK约束来限制薪水列的值范围,该约束只允许值在3,000到10,000之间。这样可以防止输入超出正常工资范围的工资。这是一个实例:
CREATE TABLE employees (
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR(55) NOT NULL,
hire_date DATE NOT NULL,
salary INT NOT NULL CHECK (salary >= 3000 AND salary <= 10000),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
注意:MySQL不支持SQL检查约束。 虽然,MySQL的所有存储引擎都会解析CHECK子句,但会将其忽略。