Oracle 11g OCP 实战:创建表与外键约束解析

需积分: 9 2 下载量 191 浏览量 更新于2024-07-19 收藏 3.6MB PDF 举报
"Oracle 11g OCP 051 中文解析" 在Oracle数据库管理中,OCP(Oracle Certified Professional)是Oracle公司为数据库管理员提供的专业认证之一,旨在证明其在特定版本的Oracle数据库技术方面的专业知识。Oracle 11g OCP认证包括一系列的考试,其中051可能是某一个特定的考试部分或题目集。 题目涉及的内容是关于SQL的`CREATE TABLE AS SELECT`语句,这是Oracle数据库中用于快速创建新表的一种方法。它允许我们基于现有表的数据创建新的表结构,同时可以包含某些特定的选项,如默认值、约束等。 题目展示了一个示例表结构,包括SALES、CUSTOMERS、PRODUCTS和TIMES四张表。其中,PROD_ID、CUST_ID和TIME_ID分别作为外键存在于SALES表中,分别关联到PRODUCTS、CUSTOMERS和TIMES表。然后,给出了一个`CREATE TABLE AS SELECT`的命令,试图从SALES表中选取prod_id、cust_id两列,并用系统当前日期(SYSDATE)作为order_date列的默认值。 现在,我们需要评估这个命令会如何执行: A. 新的NEW_SALES表不会被创建,因为默认值不能在列定义中指定。 这个选项是错误的。在Oracle中,可以在`CREATE TABLE AS SELECT`语句中指定列的默认值。 B. NEW_SALES表会被创建,并且所有在指定列上定义的NOT NULL约束都会传递到新表。 这个选项是不完整的。虽然`CREATE TABLE AS SELECT`会复制源表的非空约束,但这里没有提及NOT NULL约束。 C. NEW_SALES表不会被创建,因为CREATE TABLE命令中的列名与SELECT子句中的列名不匹配。 这个选项是错误的。从题目来看,CREATE TABLE命令中的列名(prod_id, cust_id, order_date)与SELECT子句中的列(prod_id, cust_id, time_id)是匹配的,尽管order_date列在SELECT中未显式列出,但因为在CREATE语句中指定了默认值,所以仍然匹配。 D. NEW_SALES表会被创建,并且所有在指定列上定义的外键约束都会传递到新表。 这个选项是错误的。`CREATE TABLE AS SELECT`不会复制源表的外键约束。新创建的表只包含选定列的数据,而不包括任何约束,如外键。 正确答案应该是:D. NEW_SALES表会被创建,但所有在指定列上定义的外键约束都不会传递到新表。这是因为`CREATE TABLE AS SELECT`语句不继承源表的约束,包括外键约束。因此,NEW_SALES表将不包含对PRODUCTS、CUSTOMERS和TIMES表的外键关系。 在实际应用中,如果需要在新表中保留这些外键约束,你需要单独为新表创建这些约束。这可以通过在创建表后使用`ALTER TABLE`命令添加外键约束来实现。对于默认值,如order_date列的SYSDATE,默认值将在新表中生效,因为它是在CREATE TABLE语句中明确指定的。