1

我使用 dbms_metadata 编写了一个自动化脚本,为模式中的所有表生成 CTAS 脚本。

SELECT ' CREATE TABLE '
  ||SUBSTR(TABLE_NAME,1,26)
  ||'_BKK ('
  ||COL
  ||')'
  || ' NOLOGGING AS SELECT '
  || COL
  || ' FROM '
  || TABLE_NAME
  ||';' QUERY
FROM DATA2;

但是请注意,CTAS 不会复制每列的默认值。有什么办法可以获取默认列和值,以便我可以围绕它创建自动化脚本?

4

2 回答 2

1

但是注意到 CTAS 不会复制每列的默认值

原因很简单。CTAS 仅用于复制数据而不是元数据(表结构除外)。

所以,你会失去:

  • 所有约束
  • 所有索引
  • 所有赠款

基本上,与表相关的所有内容。

您必须提取元数据并更改表并显式应用它。

alter table new_table_name modify (column default 1);

或者,您可以:

  • 使用dbms_metadata.get_ddl获取表DDL
  • 用新名称重命名表
  • 将旧表中的数据插入新表。

当然,后者会慢得多。

更新

有一种方法可以使用CTAS提供默认值不是空约束

设置

SQL> create table t1 (id number default 1 not null, text varchar2(10));

Table created.

SQL> insert into t1 (text) values ('a');

1 row created.

CTAS

SQL> create table t2 (id default 1 not null, text )
  2  as select * from t1;

Table created.

SQL> select *from t2;

        ID TEXT
---------- ----------
         1 a

使用默认值以及旧表中的数据创建新表。

于 2015-10-12T09:49:25.097 回答
0

感谢@Lalit Kumar B 对 CTAS 工作原理的详细描述。但是我想在表中获得具有默认值的库尔姆,以便我可以在其上编写一些自动化脚本。

Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT
from DBA_TAB_COLUMNS
where DATA_DEFAULT is not null

上面的查询帮助使用 DEFAULT 获取所有列,并使用它附加到自动脚本的结果中

于 2015-10-13T06:43:34.877 回答