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;

 

posted @ 2021-06-18 15:27  赵Gary  阅读(125)  评论(0)    收藏  举报