我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
当前回答
创建表xyz_new作为select * from xyz;
——这将创建表并复制所有数据。
Delete from xyz_new;
-这将有相同的表结构,但所有复制的数据将被删除。
如果你想克服答案中指定的限制: 如何在不复制数据的情况下创建Oracle表的副本?
其他回答
使用sql developer选择表并单击DDL选项卡
在sql工作表中运行该代码时,可以使用该代码创建没有数据的新表
Sqldeveloper是oracle提供的一个免费应用程序。
如果表有序列或触发器,ddl有时也会为您生成这些。你只需要注意它们的顺序,知道什么时候打开或关闭触发器。
以上任务可以通过两个简单步骤完成。
步骤1:
CREATE table new_table_name AS(Select * from old_table_name);
上面的查询创建了一个表的副本(包括内容)。
若要获得结构,使用删除表的内容。
步骤2:
DELETE * FROM new_table_name.
希望这能解决你的问题。感谢之前的帖子。给了我很多启发。
WHERE 1 = 0或类似的假条件可以工作,但我不喜欢它们的样子。Oracle 12c+ IMHO的代码稍微干净一些
创建表栏AS SELECT * 从foo 只获取前0行;
同样的限制适用:只有列定义及其可空性被复制到新表中。
DECLARE
l_ddl VARCHAR2 (32767);
BEGIN
l_ddl := REPLACE (
REPLACE (
DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA'))
, q'["OLDSCHEMA"]'
, q'["NEWSCHEMA"]'
)
, q'["OLDTABLSPACE"]'
, q'["NEWTABLESPACE"]'
);
EXECUTE IMMEDIATE l_ddl;
END;
创建表xyz_new作为select * from xyz;
——这将创建表并复制所有数据。
Delete from xyz_new;
-这将有相同的表结构,但所有复制的数据将被删除。
如果你想克服答案中指定的限制: 如何在不复制数据的情况下创建Oracle表的副本?