oracle 插入表数据时,自动生成ID

今天因为某些原因,需要把达梦数据库(oracle)里面的一张视图的大量数据某些字段插到另外一张表里面,但是又因为这张视图没有ID,插入表ID又不能为null,这时候就可以在插入的时候自动生成ID,记录sql:

insert
into
        TABLE
        (
                ID,..........
        )
SELECT
        sys_guid(),
        ...........
FROM
        VIEW
WHERE
        .......

这样执行完后,插入到TABLE的数据就会自动生成ID

### 插入语句实现主键 ID 自动生成的方法 在 Oracle 数据库中,实现主键 ID 自动生成的方法主要包括使用序列(Sequence)、触发器(Trigger)以及 IDENTITY 列(Oracle 12c 及以上版本支持)。 #### 使用序列生成主键值 序列是一种数据库对象,用于生成唯一的数值,常用于模拟自增主键的功能。可以在插入语句中直接调用序列的 `NEXTVAL` 函数来生成主键值。 ```sql -- 创建序列 CREATE SEQUENCE example_table_seq START WITH 1 INCREMENT BY 1; -- 插入语句中使用序列 INSERT INTO example_table (id, name) VALUES (example_table_seq.NEXTVAL, 'John'); ``` 此方法适用于所有 Oracle 版本,通过显式调用序列,确保每次插入生成唯一的主键值 [^3]。 #### 使用触发器自动生成主键 触发器可以在插入操作发生自动为主键字段赋值。通过定义 `BEFORE INSERT` 触发器,在插入数据自动调用序列生成主键值。 ```sql -- 创建序列 CREATE SEQUENCE example_table_seq START WITH 1 INCREMENT BY 1; -- 创建触发器 CREATE OR REPLACE TRIGGER trg_example_table BEFORE INSERT ON example_table FOR EACH ROW BEGIN :NEW.id := example_table_seq.NEXTVAL; END; / -- 插入语句中无需指定主键字段 INSERT INTO example_table (name) VALUES ('Emma'); ``` 此方法对应用透明,插入数据无需显式指定主键字段,适用于所有 Oracle 版本 [^2]。 #### 使用 IDENTITY 列(Oracle 12c+) 从 Oracle 12c 开始,可以使用 `IDENTITY` 列定义自增主键,数据库自动管理主键值的生成。 ```sql -- 建定义自增主键 CREATE TABLE example_table ( id NUMBER GENERATED ALWAYS AS IDENTITY, name VARCHAR2(100), PRIMARY KEY (id) ); -- 插入语句中无需指定主键字段 INSERT INTO example_table (name) VALUES ('Product_C'); ``` 此方法语法简洁,无需显式创建序列或触发器,是推荐的新项目实现方式 [^1]。 ### 性能与适用性对比 | 方法 | 适用版本 | 优点 | 缺点 | |------------------|-------------|----------------------|---------------------| | 序列直接调用 | 所有版本 | 显式控制主键生成 | 每次插入需手动调用 | | 触发器自动填充 | 所有版本 | 自动生成,对应用透明 | 需维护额外数据库对象 | | IDENTITY 列 | Oracle 12c+ | 语法简洁,无需额外对象 | 仅适用于新版数据库 | ### 相关问题 1. 如何在触发器中添加自定义前缀到主键值中? 2. 大批量插入如何避免主键序列生成带来的性能瓶颈? 3. Oracle 12c 的 IDENTITY 列与统序列有何区别?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值