如何从11g中的select语句为新创建的表的列设置默认值

时间:2011-05-09 07:56:46

标签: oracle oracle11g

我在Oracle 11g中创建了一个表,其中一列是默认值。语法是:

create table xyz(emp number,ename varchar2(100),salary number default 0);

这已成功创建。出于某些原因,我需要创建另一个具有相同旧表结构和数据的表。所以我创建了一个名为abc的新表格作为

create table abc as select * from xyz. 

这里“abc”使用与旧表xyz相同的结构和数据成功创建。但是对于旧表“xyz”中的“salary”列,默认值设置为“0”。但是在新创建的表“abc”中,未设置默认值。

这完全在Oracle 11g中。请告诉我没有设置默认值的原因以及我们如何使用select语句设置它。

4 个答案:

答案 0 :(得分:28)

您可以在CREATE TABLE AS SELECT中指定约束和默认值,但语法如下

create table t1 (id number default 1 not null);
insert into t1 (id) values (2);

create table t2 (id default 1 not null)
as select * from t1;

也就是说,它不会从源表/ select继承约束。只有数据类型(长度/精度/比例)由select确定。

答案 1 :(得分:8)

原因是CTAS(Create table as select)不会将任何元数据从源表复制到目标表,即

  • 没有主键
  • 没有外键
  • 无资助
  • 没有索引
  • ...

要实现你想要的,我要么

  • 使用dbms_metadata.get_ddl获取完整的表结构,用新名称替换表名,执行此语句,然后执行INSERT以复制数据
  • 或继续使用CTAS,从user_constraints中提取源表的非空约束,然后将它们添加到目标表中

答案 2 :(得分:5)

您需要alter table abc modify (salary default 0);

答案 3 :(得分:1)

新表仅继承“not null”约束而没有其他约束。 因此,您可以在使用“create table as”命令创建表后更改该表 或者您可以按照

定义所需的所有约束
create table t1 (id number default 1 not null);
insert into t1 (id) values (2);

create table t2 as select * from t1;

这将创建非空约束的表t2。 但是对于除“not null”之外的其他一些约束,您应该使用以下语法

create table t1 (id number default 1 unique);
insert into t1 (id) values (2);

create table t2 (id default 1 unique)
as select * from t1;