在 AS400 的 INSERT INTO 语句中增加一个 ID

Increment an ID within an INSERT INTO statement in AS400

有没有办法将新记录插入具有非唯一 ID 的 table 并将此 ID 设置为同一 SQL 语句中的下一个数字?

类似

INSERT INTO T1 (id, fname, lname)
VALUES ([last id + 1], 'Dan', 'Thomson');
DECLARE @COUNTER INT;
SET @COUNTER = 1;

WHILE(@COUNTER <= XXX)
BEGIN

INSERT INTO T1 (id, fname, lname)
VALUES (@COUNTER, @FNAME , @LNAME);

SET @COUNTER = @COUNTER + 1;

END

这可能有效

INSERT INTO T1 (id, fname, lname)
VALUES (ifnull((select max(id) from T1),0) + 1, 'Dan', 'Thomson')

Built-in function MAX :

INSERT INTO T1 (id, fname, lname)
SELECT ifnull(MAX(id)+ 1,1), 'Dan', 'Thomson' FROM T1

Insert and set value with max()+1 problems

SELECT MAX(col) +1 is not safe -- it does not ensure that you aren't inserting more than one customer with the same customer_id value, regardless if selecting from the same table or any others.

为了性能,加个索引:

CREATE INDEX T1_INDEX1 ON T1 (id) DESC

参考文献:

单元测试

-- Create Table
SET SCHEMA QTEMP;
CREAT TABLE testtbl (
    id integer not null default,
    fname char(10) not null default,
    lname char(10) not null default)
;
-- Initialize Table with Data
insert into 
testtbl ( id , fname, lname)
values
( 1, 'fname1', 'lname_1'),
( 2, 'fname2', 'lname_2'),
( 2, 'fname3', 'lname_3'),
( 3, 'fname4', 'lname_4')
;
-- Test Insert Statement
INSERT INTO 
testtbl ( id, fname, lname )
SELECT ifnull(MAX( id ) + 1, 1), 'Dan', 'Thomson' FROM testtbl;
--Confirm Expectation
select * from testtbl;

ID           FNAME       LNAME       
-------------------------------------
1            fname1      lname_1     
2            fname2      lname_2     
3            fname4      lname_4     
4            Dan         Thomson     

如果您想插入 table 的所有内容,唯一 ID 以最大 +1 开头

INSERT INTO T1 (id, fname, lname)
select
rownumber() over() + ifnull((select max(T1.id) from T1), 0),
T2.zone1, T2.zone2 
from T2