[20121020]主外键约束以及NULL问题.txt

[20121020]主外键约束以及NULL问题.txt
主外键约束可以一定程度保证数据完整性,但是如果外键输入的是NULL,情况会如何呢?
SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

1.测试1:
drop table t1 purge;
drop table t2 purge;
create table t1( id number, name varchar2(10));
alter table t1 add constraint pk_t1 unique (id, name);
SQL> desc t1;
Name   Null?    Type
------ -------- ----------------
ID              NUMBER
NAME            VARCHAR2(10)
create table t2( id2 number ,id number, name varchar2(10));
alter table t2 add constraint fk_t2 foreign key(id, name) references t1(id, name);
insert into t1 values(1,'test');
commit ;

insert into t2 values(1,2,'test');
insert into t2 values(2,1,'aaaa');
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_T2) violated - parent key not found

--但是当我们插入空值时:
insert into t2 values(3,1,null);
insert into t2 values(4,2,null);
insert into t2 values(5,null,'aaaa');
insert into t2 values(6,null,'bbbb');
insert into t2 values(7,null,null);
commit ;
SQL> set NULL NULL
SQL> select * from t2;
       ID2         ID NAME
---------- ---------- ----------
         3          1 NULL
         4          2 NULL
         5 NULL       aaaa
         6 NULL       bbbb
         7 NULL       NULL
2.测试2:
drop table t1 purge;
drop table t2 purge;
create table t1( id number, name varchar2(10));
alter table t1 add constraint pk_t1 primary key (id, name);
SQL> desc t1
Name   Null?    Type
------ -------- -------------
ID     NOT NULL NUMBER
NAME   NOT NULL VARCHAR2(10)

create table t2( id2 number ,id number, name varchar2(10));
alter table t2 add constraint fk_t2 foreign key(id, name) references t1(id, name);
insert into t1 values(1,'test');
commit ;

insert into t2 values(1,2,'test');
insert into t2 values(2,1,'aaaa');
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_T2) violated - parent key not found

--但是当我们插入空值时:
insert into t2 values(3,1,null);
insert into t2 values(4,2,null);
insert into t2 values(5,null,'aaaa');
insert into t2 values(6,null,'bbbb');
insert into t2 values(7,null,null);
commit ;
SQL> set NULL NULL
SQL> select * from t2;
       ID2         ID NAME
---------- ---------- ----------
         3          1 NULL
         4          2 NULL
         5 NULL       aaaa
         6 NULL       bbbb
         7 NULL       NULL
3.总结:
    
    所以要保证完整性,还要定义外键NOT NULL.
时间: 2024-10-23 20:08:05

[20121020]主外键约束以及NULL问题.txt的相关文章

[20151231]主外键与空表(12c).txt

[20151231]主外键与空表(12c).txt --主外键的测试例子很多,今天做一个特别的,外部键表为空,也会出现阻塞吗?测试看看. 1.建立环境: SCOTT@test01p> @ver1 PORT_STRING                    VERSION        BANNER                                                                               CON_ID --------------

[20160704]NULL与主外键问题.txt

[20160704]NULL与主外键问题.txt --主外键的问题主要出现在阻塞等情况,有许多极端dba认为应该取消这个约束.当然从使用的角度出发有总比没有好.只是不要过度滥用. --我这里遇到一个问题,开发指出主外键"失效",我仔细检查发现建立的主表索引是唯一,而非主键,这样可以插入NULL,导致所谓的"失效". --我开始意味是因为oracle索引不记录NULL而导致的(主键仅仅一个字段).实际上我的测试还是有点意外: 1.环境: SCOTT@book>

主外键关联删除(on delete set null和on delete cascade)

主外键关联,当删除的是父表数据,参照这些要删除的数据,Oracle有三种处理方式: 1.禁止删除,也是Oracle默认方法. 2.将参照要删除数据的子表对应数据置空. 3.将参照要删除数据的子表对应数据删除. 对于1,比较容易理解,不解释. 对于2,需要使用on delete set null建立外键约束.实验: create table dept_test(deptno number(10) not null, deptname varchar2(30) not null, constrain

[20160719]主外键与延迟约束2.txt

[20160719]主外键与延迟约束2.txt --前几天遇到的问题,因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --主要开发有需求要删除主表的记录,由于条件写错,导致以上情况出现.实际上oracle支持延迟约束,只有提交的时候才会检查. --自己通过例子说明: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ---------------

[20160716]主外键与延迟约束.txt

[20160716]主外键与延迟约束.txt --前几天遇到的问题,因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --主要开发有需求要删除主表的记录,由于条件写错,导致以上情况出现.实际上oracle支持延迟约束,只有提交的时候才会检查. --自己通过例子说明: 1.环境: SCOTT@test01p> @ ver1 PORT_STRING           VERSION    BANNER                                

sql server中的外键约束

server sql server中建立外键约束有3中方式:1.Enterprise Manager中,Tables,Design Table,设置Table的properties,   可以建立constraint, reference key;2.Enterprise Manager中,Diagrams, new Diagrams,建立两个表的关系.3.直接用transact sql语句. 三个方法都需要先建立数据表.-- 创建表author :CREATE TABLE [dbo].[aut

讲解SQL与Oracle外键约束中的级联删除

最近软件系统中要删除一条记录,就要关联到同时删除好多张表,它们之间还存 在着约束关系.所以考虑到在创建表时加上约束关系,详细内容如下: SQL的外键约束可以实现级联删除与级联更新; ORACLE则只充许级联删除. SQL级联删除与级联更新使用格式: CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20)) CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDAT

MySQL · 捉虫动态 · 并行复制外键约束问题二

背景 并行复制可以大大提高备库的 binlog 应用速度,内核月报也多次对并行复制特性进行介绍,感兴趣的朋友可以回顾下:5.6 并行复制实现分析.5.6 并行复制恢复实现 和 5.6并行复制事件分发机制. 在早期的内核月报,有一篇 并行复制外建约束问题,介绍阿里在 5.5 版本中自己实现并行复制时遇到的外键约束问题,本文接着前作继续介绍并行复制外键约束问题,这次场景不一样,并且目前官方 5.6 最新版本(5.6.30)中也有这个问题. 问题描述 一般情况的复制是 A->B 这样一主一备,本文要描

mysql外键约束使用详解

MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY     [index_name] (index_col_name, ...)     REFERENCES tbl_name (index_col_name,...)     [ON DELETE reference_option]     [ON UPDATE reference_opt