我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
当前回答
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;
其他回答
我使用的方法,你接受了很多,但有人指出,它不复制约束(除了NOT NULL,我认为)。
如果你想复制完整的结构,一个更高级的方法是:
SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;
这将为您提供完整的create语句文本,您可以根据需要对其进行修改以创建新表。你必须改变表的名字,当然还有所有的约束。
(你也可以在旧版本中使用EXP/IMP来做到这一点,但现在更容易了。)
编辑添加 如果您要查找的表在不同的模式中:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
你也可以做
create table abc_new as select * from abc;
然后截断表abc_new。希望这能满足你的要求。
以上任务可以通过两个简单步骤完成。
步骤1:
CREATE table new_table_name AS(Select * from old_table_name);
上面的查询创建了一个表的副本(包括内容)。
若要获得结构,使用删除表的内容。
步骤2:
DELETE * FROM new_table_name.
希望这能解决你的问题。感谢之前的帖子。给了我很多启发。
如果需要为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中的列类型或大小不匹配 分区
进一步阅读请参阅此…
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;