约束的一些知识积累

结论:有外键约束的字段可以为空。如果不为空的话,则一定要满足外键的约束关系, 组合外
键中有列为空,Oracle不再检查其他列是否满足外键约束的条件,而使得这条记录直接插入到
子表中。


SQL> create table t_p (id number, name varchar2(30),constraint pk_t_p primary k
ey (id, name));
SQL> create table t_c (id number, f_id number,f_name varchar2(30),
constraint fk_t_c foreign key (f_id, f_name) references t_p);
SQL> insert into t_p values (1, 'a');
SQL> insert into t_c values (1, 1, 'a');
SQL> insert into t_c values (1, 1, 'b');
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_T_C) violated - parentkey not found
SQL> insert into t_c values (1, null, 'b');
SQL> insert into t_c values (1, null, 'b');
SQL> select * from t_c;
1 1 a
1 b
1 b

 

Primary key 与Unique Key都是唯一性约束。但二者有很大的区别:
1、Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自
动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。
2、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。
SQL> create table t (a int,b int,c int,d int);
SQL> desc t
Name Null? Type
----------------------------------------- -------------------
A NUMBER(38)
B NUMBER(38)
C NUMBER(38)
D NUMBER(38)
SQL> alter table t add constraint pk_t primary key(a,b);
SQL> desc t
Name Null? Type
----------------------------------------- ------------------------
A NOT NULL NUMBER(38)
B NOT NULL NUMBER(38)
C NUMBER(38)
D NUMBER(38)
可以看到A、B两个列都自动改为了NOT NULL
SQL> alter table t modify (a int null); *
ERROR at line 1:
ORA-01451: column to be modified to NULL cannot be modified toNULL
可以看到,列A不允许改为NULL
SQL> alter table t drop constraint pk_t;
SQL> alter table t add constraint uk_t_1 unique(a,b);
SQL> desc t
Name Null? Type
-----------------------------------------
A NUMBER(38)
B NUMBER(38)
C NUMBER(38)
D NUMBER(38)
我们看到列A又变回了NULL。
注意到,在删除主键时,列的NULLABLE会回到原来的状态。如果在创建主键后,对原来为NULL
的主键列,显式设为NOT NULL,在删除主键后仍然是NOT NULL。比如在创建主键后,执行下面
的操作,可以看到:
SQL> alter table t modify (b int not null);
SQL> alter table t drop constraint pk_t;
SQL> desc t
A NUMBER(38)
B NOT NULL NUMBER(38)
C NUMBER(38)
D NUMBER(38)
再做如下的实验:
SQL> drop table t;

 

SQL> create table t (a int,b int,c int,dint);
SQL> alter table t add constraint uk_t_1 unique(a,b);
SQL> alter table t add constraint uk_t_2 unique(c,d);
可以看到可以增加两个UNIQUE KEY。看看能不能增加两个主键:
SQL> alter table t add constraint pk_t primary key(c);
Table altered.
SQL> alter table t add constraint pk1_t primary key(d);
ORA-02260: table can have only one primary key
由此可以看到一个表只能有一个主键。
SQL> alter table t drop constraint pk_t;


SQL> insert into t (a ,b ) values(null,null);
SQL> /
1 row created.(可以重复插入都为null的值)

一、在这个表里头,如果继续给A,B列继续插入NULL值,是可以写入的。具体原因见下。

 

二、当你在数据库表T中已插入了值NULL,1或者1,NULL,那么你再执行下边的操作,会出现唯一键约束违反:(而两个列A、B都给NULL的话,那么可以冲服务插入) 具体原因见下。


SQL> insert into t (a ,b ) values(null,1);
1 row created.
SQL> /
ERROR at line 1:
ORA-00001: unique constraint (SYS.UK_T_1) violated
SQL> insert into t (a ,b ) values (1,null);
1 row created.
SQL> /
insert into t (a ,b ) values (1,null)
ORA-00001: unique constraint (SYS.UK_T_1) violated


 

三、具体原因:

主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL
值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值