我在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语句设置它。
答案 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)不会将任何元数据从源表复制到目标表,即
要实现你想要的,我要么
答案 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;