Create TABLE 在可以为一张表指定多个主键主键后,出现语法错误!

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

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

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

列的记录所以出现异常。

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

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

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

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

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

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

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

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

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

现在我们一系列的操作:

从上边的操作中可以看出当我们删除了主表中的记录后,子表中相應的记录

通过引用行为可以确定如何处理子表中的外键字段引用类型包括3中类型:

2.on set null;--删除主表中的记录后,子表中的相应记录的列被设置為null(但子表的该字段必须支持null值)

3.on no action;--不允许删除主表中被引用的数据,该操作会被禁止

如果有on delete cascade,而且没有在子表上加索引:那么每删除主表Φ的一行

都会对子表做一个全表扫描而且如果从父表删除多行,那么每从父表中删除一行

大家可以从上面的执行计划中看出向子表添加索引前后查询的差别。如果两表中的数据量再大点

的话那么效果可能会更明显


}

我要回帖

更多关于 可以为一张表指定多个主键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信