You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复制含GENERATED ALWAYS标识列的Oracle表数据(ORA-32795)

解决ORA-32795:复制Oracle带GENERATED ALWAYS标识列的数据

针对ORA-32795错误,有三种可靠方法可以保留原ID值完成数据复制,无需破坏生产环境的标识列配置:

方法1:临时修改标识列属性(适合小批量数据)

先将目标表的标识列临时改为GENERATED BY DEFAULT,允许手动插入值,完成复制后改回原配置:

  1. 确认目标表的标识列定义:
    SELECT column_name, generation_type 
    FROM user_tab_identity_columns 
    WHERE table_name = 'YOUR_TABLE_NAME';
    
  2. 修改标识列属性:
    ALTER TABLE YOUR_TABLE_NAME 
    MODIFY ID GENERATED BY DEFAULT AS IDENTITY;
    
  3. 执行数据插入(比如通过数据库链接从源表复制):
    INSERT INTO YOUR_TABLE_NAME SELECT * FROM SOURCE_TABLE@SOURCE_DB_LINK;
    
  4. 恢复原标识列配置:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:47:42