在本教程中,您将学习如何使用SQL约束。
约束只是对表的一个或多个列的限制,以限制可以存储在该列中的值的类型。约束提供了一种标准机制来维护数据库表内数据的准确性和完整性。
SQL中有几种不同类型的约束,包括:
现在,让我们详细讨论每个约束。
该NOT NULL限制指定列不接受NULL值。
这意味着,如果NOT NULL对列施加约束,那么您必须在表中插入新行而不为该列添加非NULL值。
以下SQL语句创建一个名为person的表,该表有四列,其中三列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约束标识具有唯一标识表中的行值的列的列或集。表中的任何两行都不能具有相同的主键值。同样,您不能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约束和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约束指定列的默认值。
列的默认值是当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语句中无需为该列显式分配一个值即可在表中插入新行。
外键(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约束来限制薪水列的值范围,该约束只允许值在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子句,但会将其忽略。