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

git*_*com 21 oracle oracle11g

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

create table xyz(emp number,ename varchar2(100),salary number default 0);
Run Code Online (Sandbox Code Playgroud)

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

create table abc as select * from xyz. 
Run Code Online (Sandbox Code Playgroud)

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

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

Gar*_*ers 31

您可以在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;
Run Code Online (Sandbox Code Playgroud)

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


Fra*_*itt 9

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

  • 没有主键
  • 没有外键
  • 没有补助金
  • 没有索引
  • ...

为了实现你想要的,我要么

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

  • CTAS并不这样做,因为制作表格的精确副本是一种特殊情况; `select`可能比在这种情况下复杂得多 - 引用几个表,具有固定值或函数调用,一个联合等.在许多情况下它*不能*确定任何这些东西,并且在极少数情况下它可能,您可能不希望它. (2认同)

Col*_*art 6

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