内容要点
- 主键
- 外键
- 唯一约束
- 检查约束
约束
- 关系型数据库存储分解为多个表的数据
- 每个表存储相应的数据
- 利用键建立从一个表到另一个表的引用(引用完整性)
正确的关系型数据库设计,需要保证只在表中插入合法数据,DBMS通过在数据库表上施加约束来实施引用完整性。
主键
主键是一种特殊的约束,表中的一列的值唯一标识表中的每一行。
任意列满足以下条件,都可用于主键:
- 任意两行的主键值都不相同
- 每行都具有一个主键值
- 包含主键值的列从不修改或更新
- 主键值不能重用
创建表时定义
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL PRIMARY KEY,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) NULL,
vend_city CHAR(50) NULL,
vend_state CHAR(5) NULL,
vend_zip CHAR(10) NULL,
vend_country CHAR(50) NULL
);
添加关键字PRIMARY KEY,使其成为主键
使用CONSTRAINT语法
ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY (vend_id);
也可以用于CREATE TABLE 。
外键
- 外键是表中的一列,其值必须列在另一表的主键中
- 外键是保证引用完整性的及其重要部分
创建表时定义
CREATE TABLE Orders
(
order_num INTEGER NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)
);
使用REFERENCES关键字
使用CONSTRAINT语法
ALTER TABLE Orders
ADD CONSTRAINT
FOREIGN KEY (cust_id) REFERENCES Customers(cust_id);
同上。
唯一约束
唯一约束用来保证一列中的数据时唯一的,类似于主键,但存在以下差别:
- 表中可包含多个唯一约束,但只允许一个主键
- 唯一约束列可包含NULL
- 唯一约束列可修改或更新
- 唯一约束列的值可重复使用
- 与主键不同,唯一约束不能用来定义外键
定义唯一约束
- 使用UNIQUE关键字定义
- 使用单独的CONSTRAINT定义
检查约束
检查约束用来保证列中的数据满足一组特定的条件。
常见用途:
- 检查最小或最大值
- 指定范围
- 只允许特定的值
数据类型限制了列中可保存的数据的类型,检查约束在数据类型内又做了进一步的限制,不需要依赖客户端或用户来保证正确获取它,DBMS本身将拒绝无效数据。
例1
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity>0),
item_price DECIMAL(8,2) NOT NULL
)
任何插入的行都会被检查,保证quantity大于0
例2
ADD CONSTRAINT CHECK (gender LIKE '[MF]');
使用CONSTRAINT语法添加检查约束,使gender的值为M或F。