oracle-约束
·主键
·唯一键
·外键
·检查约束
·not null
1.主键约束
1.1创建主键约束,确保表中的每个记录都用于唯一标识
方法1:
create table dept(
dept_id number primary key,
dept_desc varchar2(30)); --主键名由系统自动生成,使用默认表空间
方法2:
create table dept(
dept_id number constraint dept_pk primary key using index tablespace users,
dept_desc varchar2(30));
注意:创建主键约束时,Oracle会自动生成与约束名相同的唯一索引。
通过using index tablespace,可以设置在哪个表空间存储唯一索引
1.2添加主键约束
alter table dept
add constraint dept_pk primary key(dept_id)
using index tablespace users;
注意:如果在创建主键约束时自动创建唯一索引,那么删除或禁用主键约束时,索引都会被自动删除
如果在创建主键约束前先手动创建唯一索引,那么可以在不影响索引的情况下禁用或删除主键约束
2.强制应用唯一键 (唯一约束)
·确保列的唯一性。
·每个表只能定义一个主键,但可以定义多个唯一键
·主键列不允许存在null值,唯一键允许
2.1创建唯一约束
方法1:
create table dept(
dept_id number,
dept_desc varchar2(30) unique);
方法2:
create table dept(
dept_id number,
dept_desc varchar2(30) constraint dept_desc_uk1 unique);
方法3:
create table dept(
dept_id number,
dept_desc varchar2(30) constraint dept_desc_uk1 unique
using index tablespace users);
2.2添加唯一约束
alter table dept
add constraint dept_desc_uk1 unique(dept_desc)
using index tablespace users;
手动在创建唯一约束前在该列上创建索引,这样,在处理大量数据,因为
在删除或禁用唯一键约束时不会自动删除相关索引。
2.3可以通过唯一索引强制应用唯一键约束
3.外键约束
在下列情况下使用有好的效果:
·限定的值域较大
·需要将查找值的其他信息存储起来
·通过sql能轻松进行选择、插入、更新或删除操作
!!如果检查数据合法性的条件不经常改变,可以使用检查约束替代外键约束。
3.1外键必须引用父表中定义了主键或者唯一键的列
创建父表:
create table dept(
dept_id number primar key,
dept_desc varchar2(30));
创建外键约束:
方法1:
create table emp(
emp_id number,
name varchar2(30),
dept_id constraint emp_dept_fk reference dept(dept_id));
--外键列的值类型可指定也可不指定(不指定会自动从父表中获取)
方法2:
create table emp(
emp_id number,
name varchar2(30),
dept_id number,
constraint emp_dept_fk foreign key(dept_id) reference dept(dept_id));
3.2添加约束
alter table emp
add constraint emp_dept_fk foreign key (dept_id)
reference dept(dept_id);
4.检查约束
当限定值域较小时,使用检查约束效果好。
4.1创建检查约束
create table emp(
emp_id number,
emp_name varchar2(30),
st_flg number(1) check (st_flg in (0,1));
OR
create table emp(
emp_id number,
emp_name varchar2(30),
st_flg number(1)
constraint st_flg_chk check (st_flg in (0,1)));
使约束名更有意义,可在其中嵌入强制条件信息
create table emp(
emp_id number,
emp_name varchar2(30),
st_flg number(1)
constraint “st_flg must be 0 or 1” check (st_flg in (0,1)));
4.2为存在表添加检车约束
alter table emp add constraint
"st_flg must be 0 or 1" check (st_flg in (0,1));
5.强制应用not null约束
create table emp(
emp_id number,
emp_name varchar2(30) not null);
OR
create table emp(
emp_id number,
emp_name varchar2(30)
constraint emp_name_nn not null);
5.1为存在的表添加非空约束
alter table emp
modify(emp_name not null);
6.禁用约束
alter table emp disable constraint emp_dept_fk;
启用约束
alter table emp enable constraint emp_dept_fk;
6.1禁用与主键约束有关的所有外键约束
alter table dept disable constraint dept_pk cascade;
启用时逐个启用
!!!使用novalidate子句可以指示oracle不验证重启的约束
但会强制将来的DML遵守约束定义
alter table emp enable novalidate constraint emp_dept_fk;
7.清除违反约束的行
先确保在当前连接的方案中创建了exceptions表,如果没有,可以使用下面的
脚本创建一个:
SQL>@?/rdbms/admin/utlexcpt.sql
通过exceptions into子句,使用exceptions表存储违反约束的行
SQL>alter table emp modify constraint emp_dept_fk validate
exceptions into exceptions;
只要有违反约束的行,系统就会显示ORA-02298错误提示。高于局也会想exceptions
表中插入违反约束的行,这样就可通过exceptions表的row_id列删除所有违反约束的行了
!!!!oracle不允许禁用被引用的主键和唯一键约束。要禁用这些约束,必须先禁用外键约束。