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 约束名

  注意到,如果表中有违反约束的数据,则需要先删除数据之后才能启用约束。

  

 

posted @ 2022-08-25 18:55  Circle_Wang  阅读(405)  评论(0编辑  收藏  举报