Oracle学习——数据库定义语言(DDL)定义约束
本章将介绍数据库中的约束是什么,如何给表之间建立约束。
1、约束类型介绍
主要有5中约束,包括:
- 非空约束(NOT NULL):指定列不能包含空值
- 唯一性约束(UNIQUE):指定列或者列组合的值对于表中的行是唯一的
- 主键约束(PRIMARY KEY):表每一行的唯一表示,同时包含非空约束和唯一性约束
- 外键约束(FOREIGN KEY):在表和引用表的一个列之间建立并且强制建立一个外键关系
- 用户自定义约束(CHECK):指定一个必须为真的条件
1.1、定义约束原则
我们可以在创建表的时候创建一个约束,也可以在创建表之后再给这个表定义约束。
可以给约束起名字(默认使用SYS_C数字串),但名字在整个用户的所有约束中必须是唯一的。
2、定义非空约束(NOT NULL)
2.1、创建表时给定非空约束
语法结构:
CREATE TABLE 表名
(列名1 列属性1 NOT NULL,
列名2 列属性2 CONSTRAINT 约束命名 NOT NULL,
....
)
上述语法中对列名1的非空约束是采用系统自动命名,而列名2的约束采用的是用户指定命名。
2.2、为已有存在的列增加非空约束
只需要使用前一篇文章(SQL学习——数据库定义语言(DDL)建表、删表、修改表)中讲到的ALTER操作即可,相当于是修改表中列的某个属性。
语法结构:
ALTER TABLE 表名
MODIFY (列名 [CONSTRAINT 约束命名] NOT NULL,...)
3、定义唯一性约束(UNIQUE)
与2部分的语法结构基本一致,只需要将NOT NULL改为UNIQUE即可。
3.1、创建表时给定唯一性
语法结构:
CREATE TABLE 表名 (列名1 列属性1 UNIQUE, 列名2 列属性2 CONSTRAINT 约束命名 UNIQUE, ....
[CONSTRAINT 约束命名] UNIQUE(列名1,列名2)
)
这里相比于NOT NULL增加了一种方式,可以在创建表语句的最后使用UNIQUE(列名)的形式。
3.2、为已有存在的列增加唯一性
语法结构:
ALTER TABLE 表名
MODIFY (列名 [CONSTRAINT 约束命名] UNIQUE,....)
4、定义主键约束(PRIMARY KEY)
4.1、创建表时定义
语法结构:
CREATE TABLE 表名
(列名1 列属性1 PRIMARY KEY,
列名2 列属性2 CONSTRAINT 约束命名 PRIMARY KEY,
....
[CONSTRAINT 约束命名] PRIMARY KEY(列名1,列名2)
)
需要注意的是主键约束对一张表只能有一列,所以上述三种方法只有一种能存在(换句话说只有一个PRIMARY KEY)保留字。如果想使用联合主键,则使用第三种方式(即在最后使用PRIMARY KEY(列1列2))。
4.2、增加列的主键约束
语法结构:
ALTER TABLE 表名
ADD CONSTRAINT 约束命名 PRIMARY KEY(列名1,列名2)
这里需要注意增加约束是使用add而不是modify。
4.3、联合主键
前面已经提到了,联合主键的定义方式只能在末尾增加的形式。
语法结构:
CREATE TABLE 表名
(列名1 列属性1 ,
列名2 列属性2,
....
[CONSTRAINT 约束命名] PRIMARY KEY(列名1,列名2)
)
5、定义外键约束(FOREIGN KEY)
5.1、创建表时定义
语法结构:
CREATE TABLE 表名
(列名1 列属性1 ,
列名2 列属性2,
....
CONSTRAINT 约束命名 FOREIGN KEY(列名1) REFERENCE 参照表A表名(列名A),
[CONSTRAINT 约束命名 FOREIGN KEY(列名2) REFERENCE 参照表B表名(列名B)]
)
注意被参照的表一定要存在。
5.2、增加列的外键约束
与增加主键约束一样,也是使用alter table add语法。
语法结构:
ALTER TABLE 表名
ADD CONSTRAINT 约束命名 FOREIGN KEY(列名) REFERENCE 参照表表名(列名A)
6、用户自定义约束(CHECK)
6.1、创建表时给定CHECK约束
语法结构:
CREATE TABLE 表名
(列名1 列属性1 [CONSTRAINT 约束命名] CHECK(条件表达式),
列名2 列属性2,
....
)
6.2、修改表时定义CHECK约束
语法结构:
ALTER TABLE 表名
ADD (CONSTRAINT 约束命名 CHECK(条件表达式),
....
)
注意这里使用的是ADD进行添加约束,这里可能会思考为什么没有指定哪一个列呢?因为自定义约束是对整个表的约束,因此不用指定在某一个列上。
7、启用与禁用约束
7.1、查询约束
当我们设定一个约束只有,Orcale数据库将会把这个约束信息储存在user_constraints这个字典表中,因此我们可以使用一下SQL查询语法来查看某个表的约束信息。
SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name=表名
注意这里的表名,会被储存为大写,所以要注意查表名的时候要全部大写。
7.2、禁用约束
对于约束,我们可以对约束禁用的。
语法结构:
ALTER TABLE 表名
DISABLE CONSTRAINT 约束名 CASCADE
这里要注意约束名对于约束来说是唯一的,因此我们可以通过查询约束的方法得到这个约束名,从而完成停用操作。注意这里的CASCADE关键字是可以保证与该约束关联的其他约束也一并禁用了(例如你要禁用的约束是主键约束,并且这个约束被其他表作为参照外键了,因此如果不加这个CASCADE关键字,将报错)
7.3、启用约束
语法结构:
ALTER TABLE 表名
ENABLE CONSTRAINT 约束名
注意到,如果表中有违反约束的数据,则需要先删除数据之后才能启用约束。