使用如下的CREATE TABLE脚本(语句)创建一个名为PO_DETAIL的表。
CREATE TABLE po_detail
(po_num NUMBER NOT NULL,
po_line_id NUMBER NOT NULL,
product_id NUMBER NOT NULL,
quantity NUMBER(3)NOT NULL,
unit price NUMBER(5, 2)DEFAULT 0,
PRIMARY KEY (po_num, po_line_id),
FOREIGN KEY (po_num) REFERENCES PO_HEADER (po_num),
FOREIGN KEY (product_id) REFERENCES product (product_id),
CHECK (unit_price BETWEEN 0 and 9999.99))
TABLESPACE USERS;
其中,PO_HEADER和PO_DETAIL表的结构和表中的数据如下:
请问,在以下的INSERT语句中,哪两个将成功地执行
A.INSERT INTO po_detail (po_num, po_line_id, product_id, unit_price, quantity)
VALUES (’10056’, ’1’, ’3’, ’400’,’1052.40’);
B.INSERT INTO po_detail (po_num, po_line_id, product_id)
VALUES (10055, 1, 2);
C.INSERT INTO po_detail
VALUES (10055, 1, 2, 30, DEFAULT);
D.INSERT INTO po_detail (po_num, po_line_id, product_id, quantity, unit_price)
VALUES(10052, 2, 3, 200, NULL);
E.INSERT INTO po_detail
VALUES (10056, 1, 3, 400, 52.40);
F.INSERTINTO po_detail
VALUES (10055, 1, 2, NULL, NULL);
参考答案:C,E
解析: 这一题测试对Oracle主键约束、外键约束、非空约束和条件约束的理解,同时还测试对INSERT INTO语句的熟悉程度。这一题在OCP考试中属于复杂的题,因此在解题时要仔细阅读题目的说明和表的结构以及表中的数据。
根据本题PO DETAIL表的定义,po_num的数据类型为数字型,所以任何将po_num的值用单引号括起来的VALUES子句肯定都是错误的,所以选项A是错误的。
根据本题PO_DETAIL表的定义,除了unit_price列之外,所有的列都定义了非空约束,所以在向PO_DETAIL表中插入数据行时,除了unit_price列的值之外,其他任何列都不能为空,所以选项B和F肯定是错误的。
根据本题PO_DETAIL表的定义,PO_DETAIL表的主键是由po_num和po_line_id合而成的,所以这两个键的组合必须唯一且不能为空。将选项C的INSERT INTO语句中的数据与PO DETAIL表中的数据进行对比,可以发现po_num=10055和po_line_id=1在PO_DETAIL表中并不存在,所以这一数据行没有违反实体完整性。另外,根据外键定义FOREIGN KEY (po_num) REFERENCES PO_HEADER(po_num),要检查一下PO_HEADER表中的数据,可以发现po_num=10055的数据确实在这个表中存在,所以这一INSERT操作也不会违反引用完整性。根据条件约束的定义CHECK (unit price BETWEEN 0and 9999.99),由于在这个插入语句中unit_price使用的是默认值,所以不可能违反条件约束的限制,最终可以断定选项C是正确的。
初看上去选项D似乎正确,但是将选项D的INSERT INTO语句中的数据与PO_DETAIL表中的数据进行对比,可以发现po_num=10052和po_line_id=2在PO_DETAIL表中已经存在,所以这一数据行违反实体完整性,从而肯定选项D是错误的。
仿照对选项C的分析,同样可以确定选项E也是正确的。