如何复制含GENERATED ALWAYS标识列的Oracle表数据(ORA-32795)
解决ORA-32795:复制Oracle带GENERATED ALWAYS标识列的数据
针对ORA-32795错误,有三种可靠方法可以保留原ID值完成数据复制,无需破坏生产环境的标识列配置:
方法1:临时修改标识列属性(适合小批量数据)
先将目标表的标识列临时改为GENERATED BY DEFAULT,允许手动插入值,完成复制后改回原配置:
- 确认目标表的标识列定义:
SELECT column_name, generation_type FROM user_tab_identity_columns WHERE table_name = 'YOUR_TABLE_NAME'; - 修改标识列属性:
ALTER TABLE YOUR_TABLE_NAME MODIFY ID GENERATED BY DEFAULT AS IDENTITY; - 执行数据插入(比如通过数据库链接从源表复制):
INSERT INTO YOUR_TABLE_NAME SELECT * FROM SOURCE_TABLE@SOURCE_DB_LINK; - 恢复原标识列配置:
ALTER TABLE YOUR_TABLE_NAME MODIFY ID GENERATED ALWAYS AS IDENTITY;
方法2:使用OVERRIDING SYSTEM VALUE子句(Oracle 12c+)
无需修改表结构,直接在INSERT语句中添加该子句,强制覆盖系统自动生成的标识值:
-- 全表复制 INSERT INTO TARGET_TABLE OVERRIDING SYSTEM VALUE SELECT * FROM SOURCE_TABLE@SOURCE_DB_LINK; -- 指定列复制 INSERT INTO TARGET_TABLE (ID, COL1, COL2, COL3) OVERRIDING SYSTEM VALUE SELECT ID, COL1, COL2, COL3 FROM SOURCE_TABLE@SOURCE_DB_LINK;
方法3:数据泵(expdp/impdp)复制(Oracle 12.2+)
如果使用数据泵迁移数据,添加TRANSFORM=IDENTITY_COLUMN:NO参数,让数据泵忽略标识列的自动生成规则,直接插入原ID值:
impdp your_user/your_pwd@target_db DIRECTORY=dpump_dir DUMPFILE=your_data_dump.dmp TRANSFORM=IDENTITY_COLUMN:NO
注意事项
- 修改表结构前需确保有
ALTER TABLE权限,操作前建议备份目标表数据。 OVERRIDING SYSTEM VALUE仅支持INSERT语句,不支持MERGE或UPDATE操作。- 数据泵的
IDENTITY_COLUMN转换参数仅在Oracle 12c Release 2及以上版本可用。
内容的提问来源于stack exchange,提问作者kerner1000
相关产品推荐
相关产品推荐

