我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
当前回答
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
使用另一个表的模式创建一个新的空表。只需添加一个WHERE子句,导致查询不返回数据:
其他回答
通过其他方式,您可以从下面列出的命令获取表创建的ddl,并执行创建。
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
类型是表,程序等。
使用这个命令,您可以从数据库对象中获得大部分ddl。
只需使用一个where子句,它不会选择任何行:
create table xyz_new as select * from xyz where 1=0;
限制
以下内容不会被复制到新表中:
序列 触发器 索引 有些约束可能无法复制 物化视图日志
这也不能处理分区
WHERE 1 = 0或类似的假条件可以工作,但我不喜欢它们的样子。Oracle 12c+ IMHO的代码稍微干净一些
创建表栏AS SELECT * 从foo 只获取前0行;
同样的限制适用:只有列定义及其可空性被复制到新表中。
使用sql developer选择表并单击DDL选项卡
在sql工作表中运行该代码时,可以使用该代码创建没有数据的新表
Sqldeveloper是oracle提供的一个免费应用程序。
如果表有序列或触发器,ddl有时也会为您生成这些。你只需要注意它们的顺序,知道什么时候打开或关闭触发器。
如果需要为EXCHANGE PARTITION创建一个表(具有空结构),最好使用“..”为了交换……”条款。不过,它只能从Oracle版本12.2开始使用。
CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;
如果正常的CTAS操作没有精确地复制表结构,则在“交换分区”期间无缝地处理“ORA-14097”。我看到Oracle从原始表中遗漏了一些“DEFAULT”列和“HIDDEN”列的定义。
ORA-14097: ALTER TABLE EXCHANGE中的列类型或大小不匹配 分区
进一步阅读请参阅此…