约束是什么?
约束限制了字段的取值。约束提供了一种标准机制来维护表内数据的准确性和完整性。
SQL中有几种不同类型的约束,包括:
- NOT NULL
- PRIMARY KEY
- UNIQUE
- DEFAULT
- FOREIGN KEY
- CHECK (MySQL不支持)
现在,让我们详细讨论这些约束。
NOT NULL
NOT NULL
约束表示字段不接受空值。
这意味着,如果对字段应用NOT NULL
约束,插入新行时,该字段必须为非NULL值。
下面的SQL语句创建一个名为persons
的表,该表有4个字段,其中3个字段id
、name
和phone
不接受空值。
示例
-- Syntax for MySQL Database
CREATE TABLE persons (
id INT NOT NULL,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL
);
注意,NULL与zero(0)、blank或诸如””之类的零长度字符串不同,NULL表示没有生成任何条目。
PRIMARY KEY
主键约束表明该字段是主键。主键能唯一地标识表中的每一行。表中的任何两行都不能具有相同的主键值,此外,不能在主键列中输入NULL值。
下面的SQL语句创建一个名为persons
的表,并指定id
列作为主键。这意味着该字段不允许出现空值或重复值。
示例
-- Syntax for MySQL Database
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL
);
主键通常由表中的一个字段组成,但是也可以由多个字段组成主键,例如,雇员的电子邮件地址或ID是雇员表的逻辑主键。
UNIQUE
唯一性约束表示一个或多个字段组合在表中不能重复。
尽管唯一性约束和主键约束都强制唯一性,但主键还作为一行记录的标识。
下面的SQL语句创建一个名为persons
的表,并将phone
列指定为惟一的。这意味着该字段不允许重复。
示例
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE
);
可以在表上定义多个唯一性约束,但只能在表上定义一个主键约束。此外,与主键约束不同,唯一性允许空值。
DEFAULT
默认约束指定字段的默认值。
在执行INSERT
语句时,没有给字段提供值,字段被设置为默认值。
下面的SQL语句为country
字段指定一个默认值。
示例
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
表的主键列匹配。因此,employees
表的dept_id
列是departments
表的外键。
在MySQL中,创建表时可以通过定义外键约束来创建外键,如下所示。下面的语句在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 (MySQL不支持)
CHECK约束的作用是,对字段值作出限制。
例如,可以通过创建检查约束:只允许值从3,000到10,000,限制salary
字段的值范围。这就防止了薪金超过正常薪金范围。
示例
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不支持CHECK约束。CHECK子句会被解析,但是MySQL会忽略它。