博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

oracle-约束

Posted on 2020-01-09 09:03  myuserkill  阅读(162)  评论(0编辑  收藏  举报

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不允许禁用被引用的主键和唯一键约束。要禁用这些约束,必须先禁用外键约束。