ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 047-120

047-120

原创 Linux操作系统 作者:jbymy2000 时间:2012-03-19 09:30:23 0 删除 编辑
120. Which two statements are true regarding constraints? (Choose two.)
A. A foreign key cannot contain NULL values.
B. A column with the UNIQUE constraint can contain NULL.
C. A constraint is enforced only for the INSERT operation on a table.
D. A constraint can be disabled even if the constraint column contains data.
E. All the constraints can be defined at the column level as well as the table
level.
Answer: BD
结论:有外键约束的字段可以为空。如果不为空的话,则一定要满足外键的约束关系, 组合外
键中有列为空,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 - parent key 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 to NULL
可以看到,列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,d int);
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的值)
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值时,可以有重复的,而其他的则不能插入重复值。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11312660/viewspace-718933/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 047-119
下一篇: 047-122
请登录后发表评论 登录
全部评论

注册时间:2012-01-10

  • 博文量
    416
  • 访问量
    204213