我们接着讲添加约束的语法,刚才我们讲是创建约束,就是我们在创建表的同时,
来给你创建这个约束,我们这个内容,创建表的同时来创建这个约束,那么表已经创建好以后,
我能不能后期对这个表进行一个修改啊,可以,可以来修改这个约束,当然这个修改得加上一个双引号,
它是一个泛泛的我们称之为修改,并不是真正的修改,你看这里有说明
我可以添加或删除约束,但是不能够修改约束,因为没有提供相应的命令,你只能添加或删除,
这是一组,还有一组叫有效化或无效化约束,这个约束我先不删除你,只是让你无效化,然后再让你使用,
就是这个意思,有效化或无效化约束,这里有一个说,添加not null约束,要使用modify,他永远都特别特殊,
他呢如果你要是添加的话,下面就是我们的例子了,我们看一看,刚才我们创建了好多表,这些表也创建了相应的
一些约束,我们在这个表创建的基础之上,来添加或修改这些约束,我们现在举个例子吧,emp5,这个表有主键,
有唯一性约束,没有外键,有unique约束,我们看一下这个表的结构
desc emp5;
这个表一共有四项,这是一个主键,name这是一个not null的,email这里有一个限制,salary这里没有限制,
salary这里的number类型的,他限制的话,让你这个是非空的,那你这个salary是不是得用modify,修改还是用的alter,
alter table emp5,modify,你看我怎么写,你这里操作的是不是salary,然后呢,他还是number类型的,这个都不变,
后边给他加上一个not null,这个自然就有了一个非空的约束
alter table emp5
modify(salary number(10,2) not null)
添加成功,然后你在desc emp5,你看
desc emp5;
这里的Y就没有了,刚才这里还有,说明这个约束我添加成功,这就叫添加一个约束,然后我删除一个约束吧,
比如这里面的这个email,email有个约束,我们直接看desc看不出来,当然这个也一样,我这里刷新一下,
看一下我们刚才这个,check这里是不是多了一个约束
用了一个默认的一个命名,用了一个规则,我想把name这个约束给他删除掉,删除,删除的话我们使用的是drop,
就像我们删除一个列一样,我们使用的是drop,删列的话我们叫drop column,约束就是constraint,那么怎么指明
你删除的这个约束,我用的是这个约束名,你看这个约束名怎么写的,写到这儿来,emp5_name_nn,这样来删除这样
一个约束
alter table emp5
drop constraint emp5_name_nn
删除以后你再来看,check是不是就没有了
这就说明我们确实给他删除成功了,删除成功你看这个,这个我们要是删除他的话,那你是不是就得用这个名啊,
确实是这样的,你就是按照他这个名来命名的,sys_c005521
alter table emp5
drop constraint sys_c005521
这个也删了,你再看这里也没了,这里就没有了,是吧
那你不想添加非空了,你想添加unique的约束,unique唯一的,添加唯一的约束,
或者主键外键啊,这个type啊,利用的还是叫add,只有not null使用的是modify,add constraint我用的是unique,
给这个name吧,name没有unique,我给这个name添加unique的约束,add constraint emp5,下划线,name_uk,unique,
然后你作用在哪一个列上,name上,这个是不是有点像表级约束的写法
alter table emp5
add constraint emp5_name_uk unique(name)
然后我们看一下,unique,这里是不是多了一个name,这是我们讲的修改的一种方式,添加或删除
后面还有一个有效化或无效化约束,有效化或无效化我们看看什么意思,先看看这个无效化,在alter table
语句当中,可以使用叫disable字句,将约束无效化,什么意思啊,我以not null为列吧,我们再换一个看看,
unique,check,这个是not null的,我们用哪个都可以,看这两个,我先看这个表里面有没有数据
select * from emp3;
这个表还有三个数据,然后现在我往这个表里去插入数据的时候,你看看,insert into emp3,
values,这个主键这,主键没有,这个我给他避开吧,这里面有两个unique,一个是ID,一个是email,
现在我ID我用1004了,有一个name,有一个非空的约束,DD,email是unique的,我改成这个,3000,
大家你说我这个时候往里面插入能不能进去啊,显然不能,因为email有一个unique约束,这样因为重了
insert into emp3
values(1004,'DD','AA@126.com',3000)
违反唯一性约束条件,这个很自然,然后我们进行这样一个操作命令,alter table emp3,
我们这里叫disable,constraint,constraint谁,叫emp3_email_uk
alter table emp3
disable constraint emp3_email_uk
改了,我们把这个改成disable了,我们刷新一下你看看,大家你看,这个时候这个约束并没有给删除,
所以他不与drop,但是他变成一个灰色了,表示他现在没有起作用,没有起作用那就是言外之意,当我再往表里
再去给你插入这样一条数据的话,已经存在了,看看我能不能够插入成功
insert into emp3
values(1004,'DD','AA@126.com',3000)
给你插入这个数据的话,已经存在了,你看看我能不能插入成功,是不是可以啊
说明他现在确实是失效了,他确实是失效了,那么他失效以后,我怎么让他有效啊,那就alter table emp3,
enable constraint,emp3_email_uk,你看我能不能行
alter table emp3
enable constraint emp3_email_uk;
你看他说不行,说无法验证他,因为找到重复的关键字,这个是什么情况啊
select * from emp3;
是不是这个意思,我现在想把它置成一个unique的,但是你这里面存在一个重复的,存在一些重复的,
我就没法往里加了,那只要你这个不存在的话,才能够加,所以这个数据我得处理一下,处理的话你可以把它删了,
可以update一下,我就直接先删了吧
delete from emp3 where id = 1004;
删了
删了以后呢,我再去给他enable,你看这个时候,是不是就可以了
alter table emp3
enable constraint emp3_email_uk;
是不是就可以了,那他现在又起作用了,好了对吧
那么这个讲完以后,实际上我们整个内容就讲完了,后面有一个查询约束,和查询定义约束的列,
刚才其实我们是通过图像化界面的方式,你要是通过代码来查询的话,可以用的是这样的一个命令,
大家你了解一下就可以了,你看看大概的意思,含有的约束名,约束的类型,约束的条件,从user_constraints这个
表当中,table的名字就叫他,如果你想查询其他的表,只需要改一下employees这个内容就可以了,我看看employess表
中的约束
select constraint_name,constraint_type,search_condition
from user_constraints
where table_name = 'EMPLOYEES'
就这么多,这是这个,然后我还可以查询这个约束定义的列是什么,用的是这个命令
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
这个是你约束的名,那你这个约束的名是加在哪个列上的,你可以使用这样一个命令,
我们在这也可以看,在这是叫图形化界面的方式,我点一点就完了,这个就通过代码
这个我们讲完的话,我们这一节就说完了,大家重点就掌握这五个关键字,如何在定义当中进行一个
创建,修改的话有点类似于我们之前讲的alter table,修改表一样了,大家你也给他学习一下