sql - ORACLE:在多插入时不使用序列创建唯一值
问题描述
有一个父表(MAIN_TABLE
),需要对CHILD_TABLE
各种类型(TYPE_1/TYPE_2/TYPE_3 等)的子表()进行多次插入。那是对于单亲记录,如果有三种类型,我将有三个孩子。
WITH MAIN_TABLE AS
(
SELECT 100 AS ID,'RICK' AS NAME,5 AS LINE FROM DUAL
UNION ALL
SELECT 101 AS ID,'TOM' AS NAME,6 AS LINE FROM DUAL
)
SELECT * FROM MAIN_TABLE;
ID NAME LINE
---------- -------------------- ----------
100 RICK 5
101 TOM 6
2 rows selected.
需要将父记录插入到子表中,其中column
必须按递增顺序填充该行。
INSERT ALL
INTO CHILD_TABLE(ID, NAME, LINE, TYPE)
VALUES (ID, NAME, LINE, 'TYPE_1')
INTO CHILD_TABLE(ID, NAME, LINE, TYPE)
VALUES (ID, NAME, LINE, 'TYPE_2')
INTO CHILD_TABLE(ID, NAME, LINE, TYPE)
VALUES (ID, NAME, LINE, 'TYPE_3')
INTO CHILD_TABLE(ID, NAME, LINE, TYPE)
VALUES (ID, NAME, LINE, 'TYPE_4')
SELECT ID, NAME, LINE
FROM MAIN_TABLE;
SQL> SELECT * FROM CHILD_TABLE
100 RICK 5 TYPE_1
101 TOM 6 TYPE_1
100 RICK 5 TYPE_2
101 TOM 6 TYPE_2
100 RICK 5 TYPE_3
101 TOM 6 TYPE_3
100 RICK 5 TYPE_4
101 TOM 6 TYPE_4
8 rows selected.
在这里,我需要 5,6,7,8,9,10,11,12,而不是 5,6。如何解决这个问题?
注意: 1. 我无法创建序列 2. 如果可能,没有多个单独的插入语句。
解决方案
我强烈建议尽可能使用 Oracle 序列。如果您仍然强烈需要不使用序列,请尝试构建伪序列表并编写一些 PLSQL 函数来通过选择可用序列 + 1 来执行插入。
或者你可以做类似的事情
为您当前的最大值创建一个变量并尝试使用ROW_NUMBER() OVER (ORDER BY column_name)+@your_var
where@your_var= SELECT MAX(column_name) FROM child
推荐阅读
- c - 从堆栈上的字符串中修剪字符?
- latex - 如何删除 LaTex 中行之间的额外空间?
- r - 如何使用 big.matrix 并行化我的 Sapply 函数?(“S4”类型的对象不是子集错误)
- reactjs - 如何在私有范围内测试功能?
- c# - 防止实体框架强制转换
- javascript - AWS Lambda SNS 目标在失败或成功时不起作用
- android - 从 WorkManager Worker 插入房间数据?
- c - 无法从 Linux TTY 运行 X11 C 程序
- r - 我将如何在 R 中重新创建这种类型的图表?(绘制回归/治疗效果)
- php - 已弃用:未加括号的 `a ? 乙:丙?d : e` 已弃用