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

时间:2016-11-02 07:09:07

标签: sql ibm-midrange insert-into

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

这样的东西
INSERT INTO T1 (id, fname, lname)
VALUES ([last id + 1], 'Dan', 'Thomson');

4 个答案:

答案 0 :(得分:2)

这可能有效

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

<强> 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不安全 - 它不能确保您不会插入具有相同customer_id值的多个客户,无论是从同一表还是其他表中选择。

为了提高效果,请添加索引:

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     

答案 3 :(得分:0)

如果您想要插入具有唯一ID的表的所有内容,请使用max +1

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