在 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')
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
参考文献:
- MAX()
- CREATE INDEX
- Index Advisor, Show Statements
- Accelerated analytics - faster aggregations using the IBM DB2 for i encoded vector index (EVI) technology
单元测试
-- 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
有没有办法将新记录插入具有非唯一 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')
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
参考文献:
- MAX()
- CREATE INDEX
- Index Advisor, Show Statements
- Accelerated analytics - faster aggregations using the IBM DB2 for i encoded vector index (EVI) technology
单元测试
-- 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