CREATE TABLE AS SELECT 在 Oracle 里能复制结构和数据吗? 能,但默认只复制结构和数据,不复制主键、索引、约束、注释、默认值这些。很多人以为 CREATE TABLE new_tab AS SELECT * FROM old_tab 是“全量克隆”,结果一查 USER_C
能,但默认只复制结构和数据,不复制主键、索引、约束、注释、默认值这些。很多人以为 CREATE TABLE new_tab AS SELECT * FROM old_tab 是“全量克隆”,结果一查 USER_CONSTRAINTS 就发现主键没了,外键断了,应用插入直接报错。
NUMBER(10,2),但某行值全是整数,CTAS 可能生成 NUMBER(精度丢失)DATE 列没问题,但 TIMESTAMP WITH TIME ZONE 可能被降级成 TIMESTAMP,时区信息丢掉不能靠 CTAS 一步到位,得拆成两步:先建空表(含约束),再 INSERT。Oracle 没有像 PostgreSQL 的 CREATE TABLE ... LIKE ... INCLUDING ALL,得手动或脚本补。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
DBMS_METADATA.GET_DDL('TABLE', 'OLD_TAB') 拿到完整 DDL,改表名后执行——这是最稳的方式,能带主键、唯一约束、注释SELECT DBMS_METADATA.GET_DDL('CONSTRAINT', constraint_name) FROM USER_CONSTRAINTS WHERE table_name = 'OLD_TAB' AND constraint_type = 'P'SELECT DBMS_METADATA.GET_DDL('INDEX', index_name) FROM USER_INDEXES WHERE table_name = 'OLD_TAB',注意索引名可能冲突,新建前最好重命名expdp 默认不导出约束和索引,impdp 默认也不创建它们,除非显式指定。最容易踩的坑是只加了 CONTENT=DATA_ONLY 却忘了关掉 EXCLUDE=CONSTRAINT,INDEX 的默认行为。
EXCLUDE=STATISTICS(避免统计信息干扰),导入时加:TABLE_EXISTS_ACTION=REPLACE 和 REMAP_TABLE=old:newCONTENT=METADATA_ONLY,但记得加上 INCLUDE=TABLE,CONSTRAINT,INDEX,否则还是空壳QUERY 参数只影响数据导出,不影响 DDL;如果用了 QUERY="WHERE 1=0",数据不导,但约束和索引照常建——这点常被误认为“没生效”图形界面背后调用的是 DBMS_METADATA,但它默认不包含注释(COMMENT ON COLUMN 不属于表对象的主 DDL)。即使勾了“Include constraints”“Include indexes”,注释也得额外处理。
SELECT 'COMMENT ON COLUMN ' || table_name || '.' || column_name || ' IS ''' || comments || ''';' FROM USER_COL_COMMENTS WHERE table_name = 'OLD_TAB'NLS_LANG 设置和数据库字符集一致复制表看着简单,但 Oracle 里真正保质保量地把约束、索引、注释、默认值、虚拟列、分区定义都搬过去,靠单条命令根本做不到。得看清楚你要的是哪一层——只是临时测试用数据?那 CTAS 够用;要上线替换?必须走 DBMS_METADATA + 手动补注释 + 验证约束状态。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述