Oracle PLSQL无自增列场景下插入带连续递增id_no行的实现方案
Oracle PLSQL无自增列批量新增连续ID数据实现方案
适用场景
- 目标表未设置自增主键、序列等自增特性
- 新增数据的
id_no字段需要从当前表最大值的下一位开始连续递增 name字段需要手动指定值- 示例场景:现有40条记录,需新增40条记录
实现方案1:PL/SQL匿名块(推荐,适合批量插入)
将代码中的你的实际表名替换为真实表名,手动填写需要新增的40个name值即可直接执行:
DECLARE v_max_id NUMBER; -- 定义存储name的数组,长度匹配需要新增的记录数 TYPE name_list_type IS VARRAY(40) OF VARCHAR2(100); -- 手动填写所有需要新增的name值,按实际需求修改 name_list name_list_type := name_list_type( '测试姓名1', '测试姓名2', '测试姓名3', -- 中间依次补充剩余36个name '测试姓名40' ); BEGIN -- 获取当前表最大id_no,表为空时默认从1开始 SELECT NVL(MAX(id_no), 0) INTO v_max_id FROM 你的实际表名; -- 循环插入所有数据,id自动连续递增 FOR i IN 1 .. name_list.COUNT LOOP INSERT INTO 你的实际表名 (id_no, name) VALUES (v_max_id + i, name_list(i)); END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; /
实现方案2:单条INSERT语句(适合少量插入)
如果不想写匿名块,也可以逐行构造INSERT语句,执行完40条后统一提交即可:
-- 第1条新增数据 INSERT INTO 你的实际表名 (id_no, name) VALUES ((SELECT NVL(MAX(id_no), 0) + 1 FROM 你的实际表名), '手动填写的姓名1'); -- 第2条新增数据 INSERT INTO 你的实际表名 (id_no, name) VALUES ((SELECT NVL(MAX(id_no), 0) + 1 FROM 你的实际表名), '手动填写的姓名2'); -- 依次执行剩余38条语句后提交 COMMIT;
注意:单条插入方案在并发操作场景下可能出现ID重复问题,建议仅在独占表操作的低并发场景下使用。
内容的提问来源于stack exchange,提问作者Vanisri N
相关产品推荐
相关产品推荐

