Oracle 学习笔记 10 -- 约束
本次笔记来学习约束,约束在表中无处不在。
比如,表中的数据不同意为空或者是表中id为设为主键,都是约束。
约束分类:
主键约束(PRIMARY KEY):主键表示表中一个唯一的标识,本身不能为空。
唯一约束(UNIQUE):在一个表中仅仅能同意建立一个主键约束,其他的列不会与此列产生反复的值。
检查约束(CHECK):检查一个列的内容是否合法,如:工资在 1500 – 3000之间。
非空约束(NOT NULL):内容不能为空。
外键约束(FOREIGN KEY):两张表之间的进行约束操作。
约束也是有名字的。假设不指定约束的名字,系统会自己主动的为我们重建约束名。格式相似于sys_cn 。也能够自己创
建约束的名字,格式一般为:constraint 表名_列名_约束名 约束。之所以使用 “表名_列名_约束名”这种格式。
也是为了达到一种见名知意的效果。定义的方式:列约束必须跟在列的后面进行定义。表级约束能够不跟在列的后面,进行单独的定义。
约束的范围:列级约束和表级约束。列级约束仅仅能作用在一个列上。表级约束能够作用在多个列上,也能够作用在一个列上。
能够创建约束,也能够改动约束。
创建约束在创建表的时候创建。改动约束在表创建完毕之后再进行改动。
主要的语法格式:
列级约束定义:
CREATE TABLE table_name(
列名1 列的数据类型类型 [约束 | constraint 约束名称 约束],
列名2 列的数据类型类型 [约束 | constraint 约束名称 约束])
表级约束定义:
CREATE TABLE table_name(
列名1 列的数据类型 。
列名2 列的数据类型 ,
constraint 约束名称 约束(列名)
)
NOT NULL 约束
非空的约束仅仅能定义在列上。使用非空约束,表示一个字段的内容不同意为空,即:插入的数据必须是有内容
的,不同意为null 。
例:创建表emp2 ,表中包括三列。id , name 。 salary 。当中要求id 列不能为空。
create table emp2(
idnumber(9) constraintemp2_id_nn not null ,
namevarchar2(20) not null ,
salarynumber(10 ,2 )
)
constraintemp2_id_nn 列级约束。意思是为约束起一个名字。使用constraintkeyword来进行定义。
例:数据測试,尝试向emp2中加入name为null的数据
insert into emp2
values(1001 , null , 2000)
ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP2"."NAME")
设置非空约束之后。假设插入空值,则出现上述错误。已经指名了列名name无法插入空值。
唯一约束(UNIQUE)
列的值是唯一的,在表中的其他列中不同意有反复的值。
可是同意表中出现多个null值。
例:创建表emp3
create table emp3
(
idnumber(8) constraintemp3_id_uk unique ,
namevarchar2(20) constraintemp3_name_nn not null ,
salarynumber(10,2),
emailvarchar2(20),
--表级约束
constraintemp3_email_uk unique(email)
)
运行以下的语句两次之后:
insert into emp3
values(100 , 'zhangsan1' ,2000, 'zhang@128.com' )
ORA-00001: 违反唯一约束条件 (SCOTT.EMP3_ID_UK),提示违反了唯一的约束。可是假设插入值得集合为(100 。 'zhang' , 2000 , null)和(1001 ,'san' , 3000 , null)的两条数据。尽管上面两个值得集合中email列中都是空值,仍然能够成功插入。设置了唯一约束的列,null不觉得是反复。
主键约束(PRIMARY KEY)
一般使用在表的id上面,本身默认内容不能为空。
create table emp4
(
idnumber(8) constraintemp4_id_pk primary key ,
namevarchar2(20) constraintemp4_name_nn not null ,
salarynumber(10,2),
emailvarchar2(20),
--表级约束
constraintemp4_email_ukunique(email)
)
insert into emp4values(null , 'zhangsan' ,100 ,'125')
ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP4"."ID")
insert into emp4values(1001 , 'zhangsan' ,100 ,'125')
ORA-00001: 违反唯一约束条件 (SCOTT.EMP4_ID_PK)
当表中已经存在id 为1001 的记录时。依旧不能插入数据。
设置了主键的约束,值不是不同意为空和反复的。
外键约束(FOREIGN KEY)
外键约束是针对两张表的约束。在字表中设置的外键,在主表中必须设置成主键。
再删除是,应该先删除子表的记录在删除父表的记录。
创建外键约束语句:
constraint 约束名称 foreign key (子表列名) references 父表名(父表列名)。子表列名和父表列名应该同样。
create table emp8
(
idnumber(8) ,
name varchar2(20) constraintemp8_name_nn not null ,
salary number(10,2) check (salary >1500 and salary < 30000),
email varchar2(20),
department_id number(10),
--表级约束
constraintemp8_email_uk unique(email) ,
constraintemp8_id_pk primary key (id),
constraintemp8_dept_id_fk foreignkey (department_id) references
departments(department_id)
)
insert into emp6
values (1001 , 'aa' ,null , 2000 ,2000)
ORA-02291:违反完整约束条件 (SCOTT.EMP6_DEPT_ID_FK)
-未找到父项keyword 。上面deptment_id = 2000 在deptments表中是不存在的,则是出现上述错误。
设置了外键约束之后,字表中的列受到父表的约束,假设是父表中没有的值 。那么数据便不能插入成功。
–ON DELETE CASCADE(级联删除): 当父表中的列被删除时。子表中相相应的列也被删除–ON DELETE SET NULL(级联置空): 子表中相应的列置空
Check 约束
使用check约束。检查一个类中插入的内容是否合法。如工资在1500 - 5000 之间。
create table emp8
(
id number(8) ,
name varchar2(20) constraint emp8_name_nn not null ,
salary number(10,2) check (salary >1500 and salary < 30000),
email varchar2(20),
department_id number(10),
--表级约束
constraint emp8_email_ukunique(email) ,
constraint emp8_id_pkprimarykey (id),
constraint emp8_dept_id_fk foreign key (department_id)
references departments(department_id)
)
SQL> insert into emp8
2 values(1001 , 'zhangsan' , 2000 , 'aa' , 30) ;
1 row inserted
SQL> insert into emp8
2 values(1002 ,'zhang' , 500 , 'bb' , 30);
ORA-02290:违反检查约束条件 (SCOTT.SYS_C005496),当插入的数据不满足salary的范围便会出上述错误提示。
改动约束
改动约束
加入 not null 约束 要使用 modify
Alter table emp5
Modify(salary number(10) not null )
删除约束
Alter table emp5
Drop constraint emp5_name_nn(约束名)
加入约束
Alter table emp5
Add constraint emp5_nameul unique(name);
有效化约束和无效化约束。
Alter table emp3
enable constraint emp3——name-uk (约束名)
Alter table emp3
Disable constraint emp3——name-uk (约束名)
Oracle 学习笔记 10 -- 约束的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- oracle学习笔记第一天
oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字 1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...
- Oracle学习笔记之四sp1,Oracle 11g的常用函数
从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i) 分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...
- Oracle学习笔记之四,SQL语言入门
1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
随机推荐
- 【python】面向对象编程
No1: 类和实例 __init__方法的第一个参数永远是self,表示创建的实例本身:init相当于构造函数 No2: 数据封装 No3: 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下 ...
- HDU4578 Transformation【线段树】
<题目链接> <转载于 >>> > 题目大意: 有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部乘c. 3:区间[l ...
- HDU 5113
HDU 5113类似四色定理的什么东西,大体就是dfs了,不过有两个坑点,这个题的逼格瞬间就上去了1.剪枝很神奇,任何一种颜色都不能超过剩下总格子数的一半,想想确实显然但是比赛的时候没有想到:2.测评 ...
- AOP编程-理论篇
本节内容主要讲解AOP编程理念,包括概念讲解,使用AOP的优势,如何实现AOP,常见的实现AOP的方法. 1.AOP的概念 AOP是Aspect Oriented Programming的缩写,意思是 ...
- 大数据小白系列——MR(1)
一部编程发展史就是一部程序员偷懒史,MapReduce(下称MR)同样是程序员们用来偷懒的工具. 来了一份大数据,我们写了一个程序准备分析它,需要怎么做? 老式的处理方法不行,数据量太大时,所需的时间 ...
- spring框架加载完成后执行上下文刷新事件(ContextRefreshedEvent)
目前spring框架是j2ee比较常用的项目开发技术,只需在web.xml文件中进行少许配置即可,代码如下所示:<!--spring的配置文件--><context-param> ...
- JAVA-getComponent()与getSource()
两个方法都是获取发生事件的事件源对象,区别也许是返回的类型不同,如果是getSource()需要强制类型转换为Component 对象:而getComponent()无需转换: API的说明如下: 类 ...
- SpringBoot2使用WebFlux函数式编程
本文只是简单使用SpringBoot2使用WebFlux的函数式编程简单使用,后续会继续写关于Webflux相关的文章. 最近一直在研究WebFlux,后续会陆续出一些相关的文章. 首先看一下Srpi ...
- 数字进度条组件NumberProgressBar
数字进度条组件NumberProgressBar NumberProgressBar是一款数字进度条组件.它不仅可以通过进度条的变化展现进度,还可以通过跟随文字精确表示进度值.开发者可以对进度条进行 ...
- Django之ORM初始
上一篇写了一个静态的登录验证. 实景情况网页的登录验证都是动态验证的,过程其实是从后端拿到储存的账户与密码来和前端的输入信息进行匹配校验的. 一.把项目拆分,来一个单独登录的包,放在Django项目下 ...