Oracle学习——数据库定义语言(DDL)定义约束
本章将介绍数据库中的约束是什么,如何给表之间建立约束。
1、约束类型介绍
主要有5中约束,包括:
- 非空约束(NOT NULL):指定列不能包含空值
- 唯一性约束(UNIQUE):指定列或者列组合的值对于表中的行是唯一的
- 主键约束(PRIMARY KEY):表每一行的唯一表示,同时包含非空约束和唯一性约束
- 外键约束(FOREIGN KEY):在表和引用表的一个列之间建立并且强制建立一个外键关系
- 用户自定义约束(CHECK):指定一个必须为真的条件
1.1、定义约束原则
我们可以在创建表的时候创建一个约束,也可以在创建表之后再给这个表定义约束。
可以给约束起名字(默认使用SYS_C数字串),但名字在整个用户的所有约束中必须是唯一的。
2、定义非空约束(NOT NULL)
2.1、创建表时给定非空约束
语法结构:
1 2 3 4 5 | CREATE TABLE 表名 (列名1 列属性1 NOT NULL , 列名2 列属性2 CONSTRAINT 约束命名 NOT NULL , .... ) |
上述语法中对列名1的非空约束是采用系统自动命名,而列名2的约束采用的是用户指定命名。
2.2、为已有存在的列增加非空约束
只需要使用前一篇文章(SQL学习——数据库定义语言(DDL)建表、删表、修改表)中讲到的ALTER操作即可,相当于是修改表中列的某个属性。
语法结构:
1 2 | ALTER TABLE 表名 MODIFY (列名 [ CONSTRAINT 约束命名] NOT NULL ,...) |
3、定义唯一性约束(UNIQUE)
与2部分的语法结构基本一致,只需要将NOT NULL改为UNIQUE即可。
3.1、创建表时给定唯一性
语法结构:
1 2 3 4 | CREATE TABLE 表名 (列名1 列属性1 UNIQUE , 列名2 列属性2 CONSTRAINT 约束命名 UNIQUE , ....[ CONSTRAINT 约束命名] UNIQUE (列名1,列名2) ) |
这里相比于NOT NULL增加了一种方式,可以在创建表语句的最后使用UNIQUE(列名)的形式。
3.2、为已有存在的列增加唯一性
语法结构:
1 2 | ALTER TABLE 表名 MODIFY (列名 [ CONSTRAINT 约束命名] UNIQUE ,....) |
4、定义主键约束(PRIMARY KEY)
4.1、创建表时定义
语法结构:
1 2 3 4 5 6 | CREATE TABLE 表名 (列名1 列属性1 PRIMARY KEY , 列名2 列属性2 CONSTRAINT 约束命名 PRIMARY KEY , .... [ CONSTRAINT 约束命名] PRIMARY KEY (列名1,列名2) ) |
需要注意的是主键约束对一张表只能有一列,所以上述三种方法只有一种能存在(换句话说只有一个PRIMARY KEY)保留字。如果想使用联合主键,则使用第三种方式(即在最后使用PRIMARY KEY(列1列2))。
4.2、增加列的主键约束
语法结构:
1 2 | ALTER TABLE 表名 ADD CONSTRAINT 约束命名 PRIMARY KEY (列名1,列名2) |
这里需要注意增加约束是使用add而不是modify。
4.3、联合主键
前面已经提到了,联合主键的定义方式只能在末尾增加的形式。
语法结构:
1 2 3 4 5 6 | CREATE TABLE 表名 (列名1 列属性1 , 列名2 列属性2, .... [ CONSTRAINT 约束命名] PRIMARY KEY (列名1,列名2) ) |
5、定义外键约束(FOREIGN KEY)
5.1、创建表时定义
语法结构:
1 2 3 4 5 6 7 | 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语法。
语法结构:
1 2 | ALTER TABLE 表名 ADD CONSTRAINT 约束命名 FOREIGN KEY (列名) REFERENCE 参照表表名(列名A) |
6、用户自定义约束(CHECK)
6.1、创建表时给定CHECK约束
语法结构:
1 2 3 4 5 | CREATE TABLE 表名 (列名1 列属性1 [ CONSTRAINT 约束命名] CHECK (条件表达式), 列名2 列属性2, .... ) |
6.2、修改表时定义CHECK约束
语法结构:
1 2 3 4 | ALTER TABLE 表名 ADD ( CONSTRAINT 约束命名 CHECK (条件表达式), .... ) |
注意这里使用的是ADD进行添加约束,这里可能会思考为什么没有指定哪一个列呢?因为自定义约束是对整个表的约束,因此不用指定在某一个列上。
7、启用与禁用约束
7.1、查询约束
当我们设定一个约束只有,Orcale数据库将会把这个约束信息储存在user_constraints这个字典表中,因此我们可以使用一下SQL查询语法来查看某个表的约束信息。
1 2 3 | SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name=表名 |
注意这里的表名,会被储存为大写,所以要注意查表名的时候要全部大写。
7.2、禁用约束
对于约束,我们可以对约束禁用的。
语法结构:
1 2 | ALTER TABLE 表名 DISABLE CONSTRAINT 约束名 CASCADE |
这里要注意约束名对于约束来说是唯一的,因此我们可以通过查询约束的方法得到这个约束名,从而完成停用操作。注意这里的CASCADE关键字是可以保证与该约束关联的其他约束也一并禁用了(例如你要禁用的约束是主键约束,并且这个约束被其他表作为参照外键了,因此如果不加这个CASCADE关键字,将报错)
7.3、启用约束
语法结构:
1 2 | ALTER TABLE 表名 ENABLE CONSTRAINT 约束名 |
注意到,如果表中有违反约束的数据,则需要先删除数据之后才能启用约束。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2021-08-25 Python读取、修改、保存xml文件