您现在的位置是:首页 >

关系模式主键和外键 Oracle外键与其主键的实际应用方案

火烧 2022-08-25 09:32:58 1048
Oracle外键与其主键的实际应用方案   以下的文章主要是对Oracle主键与Oracle外键的实际应用方案的介绍 此篇文章是我很然偶在一网站上发现的 如果你对Oracle主键与Oracle外键的实

Oracle外键与其主键的实际应用方案  

  以下的文章主要是对Oracle主键与Oracle外键的实际应用方案的介绍 此篇文章是我很然偶在一网站上发现的 如果你对Oracle主键与Oracle外键的实际应用很感兴趣的话 以下的文章就会给你提供更详细的相关方面的知识

   CREATE TABLE SCOTT MID_A_TAB

   ( A VARCHAR ( BYTE)

   B VARCHAR ( BYTE)

   DETPNO VARCHAR ( BYTE)

   )TABLESPACE USERS ;

   CREATE TABLE SCOTT MID_B_TAB

   ( A VARCHAR ( BYTE)

   B VARCHAR ( BYTE)

   DEPTNO VARCHAR ( BYTE)

   )TABLESPACE USERS ;

  给MID_A_TAB表添加主键

   alter table mid_a_tab add constraint a_pk primary key (detpno);

  给MID_B_TAB表添加Oracle主键

   alter table mid_b_tab add constraint b_pk primary key(a);

  给子表MID_B_TAB添加Oracle外键 并且引用主表MID_A_TAB的DETPNO列 并通过on delete cascade指定引用行为是级联删除

   alter table mid_b_tab add constraint b_fk foreign key

  (deptno) references mid_a_tab (detpno) on delete cascade;

  向这样就创建了好子表和Oracle主表

  向主表添加数据记录

   SQL> insert into mid_a_tab(a b detpno) values( );

  已创建 行

  已用时间: : :

  向子表添加数据

   SQL> insert into mid_b_tab(a b deptno) values( );

   insert into mid_b_tab values( )

   *

  第 行出现错误:

  ORA : 违反唯一约束条件 (SCOTT B_PK)

  已用时间: : :

  可见上面的异常信息 那时因为子表插入的deptno的值是 然而此时我们主表中

  detpno列只有一条记录那就是 所以当子表插入数据时 在父表中不能够找到该引用

  列的记录 所以出现异常

  但我们可以这样对子表的数据的进行插入(即 在子表的deptno列插入null 因为我们在建表的时候

  并没有对该列进行not null的约束限制)

   SQL> insert into mid_b_tab(a b deptno) values( null);

  已创建 行

  已用时间: : :

  现在如果我们把子表mid_b_tab中deptno列加上not null约束

   SQL> alter table mid_b_tab modify deptno not null;

   alter table mid_b_tab modify deptno not null

   *

  第 行出现错误:

  ORA : 无法启用 (SCOTT ) 找到空值

  已用时间: : :

  上面又出现异常 这是因为现在mid_b_tab表中有了一条记录 就是我们先前添加的

  那条记录

   null

  现在我们要把该表的deptno列进行not null约束限制 所以Oracle不让我们这样干

  那我们就只有把该表给delete或truncate掉 然后在修改deptno列为非空

   SQL> delete from mid_b_tab;

  已删除 行

  已用时间: : :

  再次修改子表mid_b_tab表的deptno列为非空

   SQL> alter table mid_b_tab modify deptno not null;

  表已更改

  已用时间: : :

关系模式主键和外键 Oracle外键与其主键的实际应用方案

  修改成功!

  我们再次插入数据

   insert into mid_b_tab(a b deptno) values( null);

  试试

   SQL> insert into mid_b_tab(a b deptno) values( null);

   insert into mid_b_tab(a b deptno) values( null)

   *

  第 行出现错误:

  ORA : 无法将 NULL 插入 ( SCOTT MID_B_TAB DEPTNO )

  已用时间: : :

  看见现在Oracle不让我们插入空值了

  所以我们在创建子表的Oracle外键约束时 该表的引用列必须要进行not null限制 也可以在

  该列创建unique 或primary key约束 并且引用列与被引用列的数据类型必须相同

   SQL> insert into mid_b_tab(a b deptno) values( );

  已创建 行

  已用时间: : :

  此时数据插入成功 因为此时插入的 在主表中的被引用列中已经存在了

  现在我们一系列的操作

   SQL> select * from mid_b_tab ;

   A B DE

  

  

  已用时间: : :

   SQL> select * from mid_a_tab;

   A B DE

  

  

  已用时间: : :

   SQL> delete from mid_a_tab;

  已删除 行

lishixinzhi/Article/program/Oracle/201311/18331  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码