本次笔记来学习约束,约束在表中无处不在。

比如,表中的数据不同意为空或者是表中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 -- 约束的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  3. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  4. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  5. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  6. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  7. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  8. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  9. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

随机推荐

  1. 011 Linux环境下配置eclipse,以及创建maven工程

    一:maven的安装 1.安装配置maven环境变量 2.验证 二:eclipse的安装 3.解压配置eclipse 4.启动eclipse,必须在虚拟机的eclipse下启动 5.结果 三:修改配置 ...

  2. vue回调函数无法更改model的值

    data:{ isUpload:true, } 点击上传函数: getFile(event) { //选择图片 let eventId = event.target.id; let type= tes ...

  3. Codeforces 1130D1 Toy Train (Simplified) (思维)【贪心】

    <题目链接> 题目大意: 有一个的环形火车站,其中有$[1,n] n$个站台,站台上能够放糖果,火车只能朝一个方向移动,如果火车在站台$i$,那么下一秒就会在$i+1$站(如果$i=n$, ...

  4. 读取XML文件内容

    myeclipse中类的格式 上面中的RunMain.java为程序执行的入口,JdbcUtil.java为实体类,XmlDocumentUtil.java执行解释xml文件与获取里面的属性,程序所需 ...

  5. spring之基础知识总结

    spring是轻量级的(非侵入式,不用继承spring中的父类等).Spring框架主要提供了IoC容器.AOP.数据访问.Web开发.消息.测试等相关技术.本文主要介绍Spring中的一些小知识点, ...

  6. 60.Search Insert Position.md

    描述 给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引.如果没有,返回到它将会被按顺序插入的位置. 你可以假设在数组中无重复元素. 您在真实的面试中是否遇到过这个题? 样例 Given ...

  7. 电脑用bat脚本给手机批量自动安装apk文件 autoInstall.bat

    ------创建这个文件autoInstall.bat 内容如下: @ECHO off @REM 将adb.exe添加到PATH中ECHO 初始化…@SET PATH=%PATH%;%CD%\Adb@ ...

  8. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛.B.跳一跳,很简单的(Hash 倍增)

    题目链接 首先变换的周期是\(26\),而所有字符是同时变的,所以一共就只有\(26\)种树,我们对\(26\)棵树分别处理. 求某节点到根路径上的字符串,可以从根往下哈希,\(O(n)\)预处理出. ...

  9. Linux下MySQL数据库常用基本操作

    1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...

  10. Centos ATI 显卡安装,“LCD 信号超出范围” 解决方法

    centso ATI 显卡驱动安装 centos 版本 32位 6.4 Final ATI 显卡版本:Radeon HD 7400 Series 之前由于很久自己安装了centos显卡,分辨率很低不能 ...