Oracle 学习笔记 10 -- 约束
来源:互联网 发布:厄米矩阵的性质 编辑:程序博客网 时间:2024/05/21 08:43
本次笔记来学习约束,约束在表中无处不在。例如,表中的数据不允许为空或者是表中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 列级约束。意思是为约束起一个名字。使用constraint关键字来进行定义。
例:数据测试,尝试向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) -未找到父项关键字 。上面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 学习笔记 10 -- 约束
- Oracle学习笔记(10)----------- 约束
- Oracle学习笔记(10)----------- 约束
- ORACLE学习笔记 索引和约束
- Oracle学习笔记(八) 约束
- Oracle基础知识笔记(10) 约束
- oracle 培训笔记 约束
- oracle笔记(约束)
- Oracle笔记十: 约束
- 学习oracle约束
- Oracle学习----约束
- 【Oracle学习】之 约束
- 《Oracle编程艺术》学习笔记(17)-DEFERRABLE约束
- oracle学习笔记(二)---约束、授予系统权限、索引
- Oracle学习笔记(4)——约束
- Oracle 11g学习笔记--约束(constraint )的使用
- asn1学习笔记 约束
- linux shell时间戳转日期字符串
- 各种浏览器的Hack写法(chrome firefox ie等)
- 继承的访问控制_私有继承(C++语言)
- 数据库索引,B+树
- 毕业设计--基于安卓的智能小车(二)
- Oracle 学习笔记 10 -- 约束
- Eclipse下配置使用Hadoop插件
- 关于platform_driver 是如何匹配 platform_device的和如何调用到platform_driver中的probe函数的研究
- UVa 10719 - Quotient Polynomial
- Linux——从命令界面管理网页
- Android Activity之间数据传递 Parcelable和Serializable接口详解
- javaEE开发如何在oracle官网下载安装jdk?(java SE 8u5 JDK 和 Java EE 7 SDK with JDK 7 U45的区别 )
- 会计假设
- 【技能】Ext.Viewport 实现左三右一排列方式。