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

简介: [20121020]主外键约束以及NULL问题.txt主外键约束可以一定程度保证数据完整性,但是如果外键输入的是NULL,情况会如何呢?SQL> select * from v$version ;BANNER-----------------------...
[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.
目录
相关文章
|
7月前
|
关系型数据库 MySQL
非空约束:not null
非空约束:not null。
49 5
|
5月前
|
SQL
SQL NOT NULL 约束
【7月更文挑战第18天】SQL NOT NULL 约束。
48 6
|
5月前
|
SQL
SQL NOT NULL 约束
【7月更文挑战第16天】SQL NOT NULL 约束。
35 3
|
6月前
|
SQL
SQL NOT NULL 约束
SQL NOT NULL 约束
45 1
|
6月前
|
SQL
SQL NOT NULL 约束
SQL NOT NULL 约束
40 6
|
6月前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
427 0
|
关系型数据库 MySQL 开发者
MySQL 字段约束 null, not null, default, auto_increment
前言:转载,觉得有用就发了一遍 在 MySQL 中,每个字段定义都包含附加约束或者修饰符,这些可以用来增加对所输入数据的约束。 今天我们就来看一下 MySQL 的字段约束: NULL 和 NOT NULL 修饰符、DEFAULT 修饰符,AUTO_INCREMENT 修饰符。
184 0
|
SQL 关系型数据库 MySQL
MySQL非空约束(NOT NuLL)
MySQL非空约束(NOT NuLL)
276 0
|
SQL 关系型数据库 MySQL
列的完整性约束——设置表字段的非空约束(NOT NULL, NK)
列的完整性约束——设置表字段的非空约束(NOT NULL, NK)