无法使用 UNION ALL 将多个值插入 DB2 并从序列生成 ID
Can't insert multiple values into DB2 by using UNION ALL and generate IDs from sequence
我通过以下语句创建了序列:
CREATE SEQUENCE MAIN.MY_SEQUENCE START WITH 1 INCREMENT BY 1 CACHE 50;
和 table 通过以下语句:
CREATE TABLE MAIN.EMPLOYEES(
ID INTEGER NOT NULL,
NAME VARCHAR(512),
EMAIL VARCHAR(254),
PRIMARY KEY (ID)
)
现在,当我尝试使用以下语句插入新记录时:
INSERT INTO MAIN EMPLOYEES (ID, NAME, EMAIL)
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 1', 'email1@example.com') UNION ALL
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 2', 'email2@example.com')
我收到一个错误:
"NEXTVAL FOR MAIN.MY_SEQUENCE.NEXTVAL" cannot be specified in this context.. SQLCODE=-348, SQLSTATE=428F9, DRIVER=4.17.30
当我尝试插入一行时,一切正常。
我找到了使用限制列表 NEXT VALUE
here 但是这里没有提到我的情况或者我找不到它。
我的问题是是否可以使用序列中的 ID 插入多行,如果可以,我该如何实现?
它确实列出了您的案例。文档包含以下内容:
The NEXT VALUE expressions cannot be specified in the following contexts:
...
•SELECT statement for which the outer SELECT is combined with another SELECT statement using a set operator such as UNION, EXCEPT, or INTERSECT
....
(强调我的)这个陈述并不详尽,因为 UNION ALL
被认为是集合操作,所以该操作被排除在外。
这应该是可以解决的——我有点惊讶你是这样写声明的; DB2 允许您用逗号分隔数据行。也就是说,以下应该是有效的:
INSERT INTO MAIN.EMPLOYEES (ID, NAME, EMAIL)
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 1', 'email1@example.com'),
(MAIN.MY_SEQUENCE.NEXTVAL, 'Name 2', 'email2@example.com')
我通过以下语句创建了序列:
CREATE SEQUENCE MAIN.MY_SEQUENCE START WITH 1 INCREMENT BY 1 CACHE 50;
和 table 通过以下语句:
CREATE TABLE MAIN.EMPLOYEES(
ID INTEGER NOT NULL,
NAME VARCHAR(512),
EMAIL VARCHAR(254),
PRIMARY KEY (ID)
)
现在,当我尝试使用以下语句插入新记录时:
INSERT INTO MAIN EMPLOYEES (ID, NAME, EMAIL)
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 1', 'email1@example.com') UNION ALL
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 2', 'email2@example.com')
我收到一个错误:
"NEXTVAL FOR MAIN.MY_SEQUENCE.NEXTVAL" cannot be specified in this context.. SQLCODE=-348, SQLSTATE=428F9, DRIVER=4.17.30
当我尝试插入一行时,一切正常。
我找到了使用限制列表 NEXT VALUE
here 但是这里没有提到我的情况或者我找不到它。
我的问题是是否可以使用序列中的 ID 插入多行,如果可以,我该如何实现?
它确实列出了您的案例。文档包含以下内容:
The NEXT VALUE expressions cannot be specified in the following contexts:
...
•SELECT statement for which the outer SELECT is combined with another SELECT statement using a set operator such as UNION, EXCEPT, or INTERSECT
....
(强调我的)这个陈述并不详尽,因为 UNION ALL
被认为是集合操作,所以该操作被排除在外。
这应该是可以解决的——我有点惊讶你是这样写声明的; DB2 允许您用逗号分隔数据行。也就是说,以下应该是有效的:
INSERT INTO MAIN.EMPLOYEES (ID, NAME, EMAIL)
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 1', 'email1@example.com'),
(MAIN.MY_SEQUENCE.NEXTVAL, 'Name 2', 'email2@example.com')