ORACLE 外键约束对NULL的处理
2009-11-13 22:48
351 查看
刚才在网上搜这个问题的时候搜到ITPUB上yangtingkun博客里的一篇文章,写的挺好的,自己复制了一下他的实验过程,加了点步骤验证了自己的想法,也解决了疑问。
前面写过一篇文章,介绍过唯一约束的情况下,Oracle处理NULL的特点。简单的说,就是如果多个列构成了唯一,且其中包含一个以上的NULL,那么Oracle会要求不为NULL的列保持唯一。
但是在外键处理时,却不是这种方法:
可以看到,F_ID列为空,使得Oracle不再检查其他列是否满足外键约束的条件,而使得这条记录直接插入到子表中。
由于一般组合外键使用的相对比较少,所以这个问题以前还真没有注意过,这次在看文档时,才看到这个描述。
这里不讨论这样的实现是否有道理,至少Oracle认为这样实现是有道理的,而且它已经这样实现了,而且我们无法改变。那么我们能做的就是在使用复合外键的时候,应该更仔细的考虑是否允许外键列为空的问题了。
前面写过一篇文章,介绍过唯一约束的情况下,Oracle处理NULL的特点。简单的说,就是如果多个列构成了唯一,且其中包含一个以上的NULL,那么Oracle会要求不为NULL的列保持唯一。
但是在外键处理时,却不是这种方法:
SQL> create table t_p (id number, name varchar2(30), constraint pk_t_p primary k ey (id, name)); Table created. SQL> create table t_c (id number, f_id number, f_name varchar2(30), 2 constraint fk_t_c foreign key (f_id, f_name) references t_p); Table created. SQL> insert into t_p values (1, 'a'); 1 row created. SQL> insert into t_c values (1, 1, 'a'); 1 row created. SQL> insert into t_c values (1, 1, 'b'); insert into t_c values (1, 1, 'b') * ERROR at line 1: ORA-02291: integrity constraint (SCOTT.FK_T_C) violated - parent key not found SQL> insert into t_c values (1, null, 'b'); 1 row created. SQL> insert into t_c values (1, null, 'b'); 1 row created. SQL> select * from t_c; ID F_ID F_NAME ---------- ---------- ------------------------------ 1 1 a 1 b 1 b SQL>
可以看到,F_ID列为空,使得Oracle不再检查其他列是否满足外键约束的条件,而使得这条记录直接插入到子表中。
由于一般组合外键使用的相对比较少,所以这个问题以前还真没有注意过,这次在看文档时,才看到这个描述。
这里不讨论这样的实现是否有道理,至少Oracle认为这样实现是有道理的,而且它已经这样实现了,而且我们无法改变。那么我们能做的就是在使用复合外键的时候,应该更仔细的考虑是否允许外键列为空的问题了。
相关文章推荐
- ORACLE 外键约束对NULL的处理
- Oracle 数据库唯一约束中的NULL的处理
- Oracle 数据库唯一约束中的NULL的处理
- oracle 建立外键约束时on delete cascade 和 on delete set null
- oracle 建立外键约束时on delete cascade 和 on delete set null
- Oracle 创建外键约束使用 on delete cascade 或者 on delete set null 选项
- ORACLE 数据库(查询--主键外键约束)
- oracle 中oci 关于null 的处理方法
- Oracle外键约束修改行为(三)
- oracle 排序(中文,null的处理)
- Oracle 中oci 关于null 的处理方法
- oracle 中null 的处理
- oracle 删除外键约束 禁用约束 启用约束
- Oracle:查找表的主键,外键,唯一性约束,索引
- SQL与ORACLE的外键约束-级联删除
- SQL与ORACLE的外键约束-级联更新和删除
- 原:Oracle 和 SqlServer下获取主外键表名字段名约束名的语句
- Oracle-主键约束、唯一约束与外键约束
- Oracle:SQL语句--对表的操作——添加外键约束
- 兼容oracle,sqlserver,mysql数据库对null和''(空)的不同处理的解决方法