22 约束的实例
22.1 NOT NULL约束
NOT NULL约束强制列不接受NULL值。
NOT NULL约束强制字段始终包含值。意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
22.2 UNIQUE约束
UNIQUE约束唯一标识数据库表中的每条记录。
UNIQUE和PRIMARY KEY约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY约束拥有自动定义的UNIQUE约束。
注意:每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。
唯一约束是被约束的列在插入新数据时,如果和已经存在的列有相同的值,则会报错。
22.3 PRIMARY KEY约束
PRIMARY KEY约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含NULL值。
每个表都应该有一个主键,并且每个表只能有一个主键。
CREATE TABLE时的PRIMARY KEY约束
举例,在“Customers”表创建时在“客户ID”列创建PRIMARY KEY约束:
MySQL:
CREATE TABLE dbo.Customers( 客户ID INT NOT NULL, 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHAR(20) NULL, 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL, PRIMARY KEY(客户ID) );
SQL Server/Oracle/MS Access:
CREATE TABLE dbo.Customers( 客户ID INT NOT NULL PRIMARY KEY, 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHRAR(20) NULL, 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL );
举例,命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面语法:
MySQL/SQL Server/Oracle/MS Access:
CREATE TABLE dbo.Customers( 客户ID INT NOT NULL PRIMARY KEY, 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHAR(20) NULL, 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL, CONSTRAINT pk_CustomersID PRIMARY KEY(客户ID,姓名) );
注意:在上面的实例中,只有一个主键PRIMARY KEY(pk_CustomersID)。然而,pk_CustomersID的值是由两个列(客户ID和姓名)组成的。
ALTER TABLE时的PRIMARY KEY约束
举例,当表已被创建时,如需在“客户ID”列创建PRIMARY KEY约束,请使用下面的SQL:
MySQL/SQL Server/Oracle/MS Access:
ALTER TABLE Customers ADD PRIMARY KEY(客户ID);
如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法:
MySQL/SQL Server/Oracle/MS Access:
ALTER TABLE Customers ADD CONSTRAINT pk_CustomerID PRIMARY KEY(客户ID,姓名);
注意:如果使用ALTER TABLE语句添加主键,必须把主键列声明为不包含NULL值(在表首次创建时)。
删除PRIMARY KEY约束
MySQL:
ALTER TABLE Customers DROP PRIMARY KEY;
SQL Server/Oracle/MS Access:
ALTER TABLE Customers DROP CONSTRAINT pk_Customers;
22.4 FOREIGN KEY约束
一个表中的FOREIGNKEY指向另一个表中的PRIMARY KEY。
FOREIGN KEY约束用于预防破坏表之间连接的行为。
FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CREATE TABLE时的FOREIGN KEY约束
在Orders表创建时在“客户ID”列上创建FOREIGN KEY约束:
MySQL:
CREATE TABLE Orders( 订单ID INT NOT NULL, 客户ID INT NULL, 员工ID INT NULL, 订单日期 DEFAULT NULL, 发货ID INT NULL, PRIMARY KEY(订单ID), FOREIGN KEY(客户ID) REFERENCES Customers(客户ID) );
SQL Server/Oracle/MS Access:
CREATE TABLE Orders( 订单ID INT NOT NULL PRIMARY KEY, 客户ID INT NULL, 员工ID INT NULL, 订单日期 DEFAULT NULL, 发货ID INT NULL, FOREIGN KEY(客户ID) REFERENCES Customers(客户ID) );
如需命名FOREIGN KEY约束,并定义多个列的FOREIGN约束,使用如下语法:
MySQL/SQL Server/Oracle/MS Access:
CREATE TABLE Oracle( 订单ID INT NOT NULL, 客户ID INT NULL, 员工ID INT NULL, 订单日期 DEFAULT NULL, 发货ID INT NULL, PRIMARY KEY(订单ID), CONSTRAINT fk_Customers FOREIGN KEY(客户ID) REFERENCES Customers(客户ID) );
ALTER TABLE时的FOREIGN KEY约束
当“Orders”表已被创建时,如需在“客户ID”列创建FOREIGN KEY约束,请使用下面的SQL:
MySQL/SQL Server/Oracle/MS Access:
ALTER TABLE Orders ADD FOREIGN KEY (客户 ID) REFERENCES Customers(客户 ID);
如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法:
MySQL/SQL Server/Oracle/MS Access:
ALTER TABLE Orders ADD CONSTRAINT fk_CusOrders FOREIGN KEY(客户 ID) REFERENCES Persons(客户 ID);
删除FOREIGN KEY约束:
如需删除FOREIGN KEY约束,请使用下面的SQL:
MySQL:
ALTER TABLE Orders DROP FOREIGN KEY fk_CusOrders;
SQL Server/Oracle/MS Access:
ALTER TABLE Orders DROP CONSTRAINT fk_CusOrders;
22.5 DEFAULT约束
DEFAULT约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新纪录。
CREATE TABLE时的DEFAULT约束
下面的SQL在“Customers”表创建时在“城市”列上创建DEFAULT约束:
MySQL/SQL Server/Oracle/MS Access:
CREATE TABLE dbo.Customers( 客户 ID INT NOT NULL, 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHAR(20) NULL DEFAULT '北京市', 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL );
SQL Server中通过使用类似GETDATE() 这样的函数,DEFAULT约束也可以用于插入系统值:
CREATE TABLE dbo.Orders( 订单 ID INT NOT NULL, 客户 ID INT NULL, 员工 ID INT NULL, 订单日期 DATETIME NULL DEFAULT GETDATE(), 发货 ID INT NULL );
ALTER TABLE时的DEFAULT约束
当表已被创建时,如需在“城市”列创建DEFAULT约束,请使用下面的SQL:
MySQL:
ALTER TABLE Customers ALTER 城市 SET DEFAULT '北京市';
SQL Server/MS Access:
ALTER TABLE Customers ADD CONSTRAINT DE_Customers DEFAULT('北京市') FRO 城市;
Oracle:
ALTER TABLE Customers MODIFY 城市 DEFAULT '北京市';
删除DEFAULT约束
如需删除DEFAULT约束,请使用下面的SQL:
MySQL:
ALTER TABLE Customers ALTER 城市 DROP DEFAULT;
SQL Server/Oracle/MS Access:
ALTER TABLE Customers ALTER COLUMN 城市 DROP DEFAULT;
22.6 CHECK约束
CHECK约束用于限制列中的值的范围。
如果对单个列定义CHECK约束,那么该列只允许特定的值。
如果对一个表定义CHECK约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
CREATE TABLE时的CHECK约束
下面的SQL在“Customers”表创建时在“客户 ID”列上创建CHECK约束。
CHECK约束规定“客户 ID”列必须只包含大于0的整数。
MySQL:
CREATE TABLE dbo.Customers( 客户 ID INT NOT NULL, 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHAR(20) NULL, 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL, CHECK (客户 ID) );
SQL Server/Oracle/MS Access:
CREATE TABLE dbo.Customers( 客户 ID INT NOT NULL CHECK (客户 ID>0), 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHAR(20) NULL, 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL );
如需命名CHECK约束,并定义多个列的CHECK约束,请使用下面的SQL语法:
MySQL/SQL Server/Oracle/MS Access:
CREATE TABLE dbo.Customers( 客户 ID INT NOT NULL, 姓名 VARCHAR(10) NULL, 地址 VARCHAR(50) NULL, 城市 VARCHAR(20) NULL, 邮编 CHAR(6) NULL, 省份 VARCHAR(20) NULL, CONSTRAINT chk_Customers CHECK (客户 ID>0 AND 城市='北京市') );
ALTER TABLE时的CHECK约束
当表已被创建时,如需在“客户 ID”列创建CHECK约束,请使用下面的SQL:
MySQL/SQL Serve/Oracle/MS Access:
ALTER TABLE Customers ADD CHECK (客户 ID>0);
如需命名CHECK约束,并定义多个列的CHECK约束,请使用下面的SQL语法:
MySQL/SQL Server/Oracle/MS Access:
ALTER TABLE Customers ADD CONSTRAINT chk_Customers CHECK (客户 ID>0 AND 城市='北京市');
删除CHECK约束
如需删除CHECK约束,请使用下面的SQL:
SQL Server/Oracle/MS Access:
ALTER TABLE Customers DROP CONSTRAINT chk_Customers;
MySQL:
CREATE TABLE Customers DROP CHECK chk_Customers;