实验21:在表上建立不同类型的约束
- 【使用约束的目的】
保证数据的有效,保证数据的安全。 可以自己书写代码实现约束,也可以使用触 发器。最好使用 oracle 提供的五类约束,效率高,安全,维护简单
- 【Not null约束】
定义在表的列上,表明该列必须要有值,不能为 null 可以在建立表的时候说明 也 可以在表建立后修改为 not null。可以给约束指定名称。 如果不指定名称,数据库会 给一个系统自动指定名称,SYS_C####### ;
User_constraints,user_cons_columns 可以查看到约束的信息
2.1、建立表时指定 not null 约束,建立表的时候指明非空约束,一个是系统命名,一 个是我们命名
Create table t1 (name char(9) not null,
telenum char(8) constraint t1_tele_nl not null);
2.2、建立表后指定 not null 约束。使用 modify 语法。不指定名称数据库自己命名。
create table t1 as select * from dept;
alter table t1 modify ( dname not null );
- 【唯一约束unique】
列的值不能重复,可以为 NULL,是用索引来维护唯一的,索引的名称和约束的 名称相同
3.1、建立表的时候指定 UNIQUE 约束,建立表的时候指明唯一约束,一个是系统命 名,一个是我们命名。
Create table t1 (name char( 9 ) UNIQUE,
mail char( 8 ) constraint t1_mail_u UNIQUE);
3.2、建立表之后指定 UNIQUE 约束
create table t1 as select * from dept;
alter table t1 add constraint u_dname unique ( dname );
- 【Check检测约束】
Drop table t1 purge;
Create table t1 (name varchar2(8)
check ( length ( name ) > 4),
Mail varchar2( 10 ) );
- 【Primary Key主键约束】
一个表只能有一个主健,主健要求唯一并且非空,可以是联合主健,联合主健每列 都要求非空。主健能唯一定位一行,所以主键也叫逻辑 rowid ,主健不是必需的,可以 没有,主健是通过索引实现的。索引的名称和主健名称相同。
5.1、建立表的时候指定主健,系统命名
drop table t1 purge;
create table t1 (mail char( 8 ) primary key, name char( 8 )) ;
5.2、表建立后指定自命名的主健
drop table t1 purge;
create table t1( mail char( 8 ) , name char( 8 ));
alter table t1 add constraint pk_t1_mail primary key ( mail ) ;
- 【Foreign Key外键约束】
指定在表的列上,引用本表其它列,或其它表的其它列,被引用的列得有唯一约束 或者主健约束,因为引用的是索引的键值,而不是真正的表。目的是维护数据的完整性。 核心是一列是另外一列的子集,null 除外。
6.1、建立主健,建立一个外健来引用主健
drop table e purge;
drop table d purge;
create table d as select * from dept;
create table e as select * from emp;
alter table d add constraint pk_d primary key (deptNO) ;
alter table e add constraint fk_e foreign key (deptno) references d (deptno)
- 【建立被级连的外健】
alter table e drop constraint FK_E;
alter table e add constraint fk_e foreign key (deptno)
references d (deptno) on delete set null;
父表的值被删除,子表的相关列自动被赋予 NULL 值。
alter table e drop constraint FK_E;
alter table e add constraint fk_e foreign key ( deptno )
references d ( deptno ) on delete cascade;
父表的值被删除,子表的相关行自动被删除。
- 【删除约束】
8.1、任何约束都可以用约束名称来删除
Alter table ### drop constraint ****;
8.2、因为主健只能有一个,所以删除主健约束的时候也可以
Alter table ### drop primary key;
8.3、如果主健和唯一性约束被删除,自动建立的索引也会同时被清除。
Not Null 约束也可以用 alter table modify 来删除。
8.4、删除有外健引用的主健或唯一约束的时候,外健也要被级连删除。
Alter table ### drop primary key cascade;
8.5、如果不加 cascade,你删不了,报有外键在使用,不能删除。按约束的名称来删除 约束(可以删除各种约束)
Alter table t1 drop constraint sys_c03033;
8.6、非空约束的第二种删除方式
SQL > Alter table t1 modify ( name not null );
SQL > Alter table t1 modify ( name null )
【【 总结 】】
1、掌握 oracle 提供的五类约束
2、建立、查看、删除约束