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

Oracle中与SQL Server IDENTITY_INSERT开关等效的功能实现方法

Oracle实现SQL Server IDENTITY_INSERT功能的方法

你当前使用的是Oracle 12c及以上版本支持的GENERATED ALWAYS AS IDENTITY标识列,默认强制由系统自动生成列值,禁止手动指定,对应SQL Server的开关操作可以按以下步骤实现:


通用方案(兼容Oracle 12c及所有更高版本)

1. 插入指定标识值前,临时修改标识列生成规则

执行以下语句放开手动插入限制:

ALTER TABLE ProductCategory MODIFY ProductSK GENERATED BY DEFAULT ON NULL AS IDENTITY;

2. 手动插入指定SK值的行

此时可以正常插入你需要的维度表未知成员行:

INSERT INTO ProductCategory (ProductSK, ProductID, ProductName, BI_StartDate, BI_EndDate)
VALUES (-1, -1, 'Undefined', 99991231, 99991231);
COMMIT;

3. 插入完成后恢复标识列默认规则

改回强制系统生成的模式,避免后续业务插入时手动指定值破坏维度SK的连续性:

ALTER TABLE ProductCategory MODIFY ProductSK GENERATED ALWAYS AS IDENTITY;

4. (可选)调整序列起始值避免冲突

如果你手动插入的SK值大于当前标识序列的最大生成值,需要执行以下语句自动将序列下一个生成值调整为当前表中最大SK+1,防止后续自动插入时报唯一约束冲突:

ALTER TABLE ProductCategory MODIFY ProductSK GENERATED ALWAYS AS IDENTITY (START WITH LIMIT VALUE);

Oracle 18c+ 简化方案

18c及以上版本支持会话级的标识列插入开关,无需修改表结构:

-- 开启允许手动插入标识值
ALTER SESSION SET "_IDENTITY_INSERT" = ON;

-- 执行插入操作
INSERT INTO ProductCategory (ProductSK, ProductID, ProductName, BI_StartDate, BI_EndDate)
VALUES (-1, -1, 'Undefined', 99991231, 99991231);
COMMIT;

-- 关闭开关恢复默认规则
ALTER SESSION SET "_IDENTITY_INSERT" = OFF;

注意事项

  • 修改表结构的操作需要账号拥有对应表的ALTER权限
  • 插入特殊行后务必恢复标识列的默认生成规则,避免后续ETL流程出现异常
  • 维度表的-1未知成员建议在初始化表阶段就插入,避免后续生产环境修改表结构

内容的提问来源于stack exchange,提问作者user9517769

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:39:03