【问题标题】:Increment an ID within an INSERT INTO statement in AS400在 AS400 中的 INSERT INTO 语句中增加一个 ID
【发布时间】:2017-03-15 10:15:15
【问题描述】:

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

类似

INSERT INTO T1 (id, fname, lname)
VALUES ([last id + 1], 'Dan', 'Thomson');

【问题讨论】:

  • 使用带计数器变量的 WHILE 循环?
  • @Alrightythen,不清楚,请解释一下
  • 在下面发布了一个示例作为答案。
  • 这不正常,你的表应该有一个真实的id(主键),最好是加一列自增。当然,如果需要,您也可以保留旧身份证。但是将其用作 id 是一个坏主意,因为有太多人同时添加一行,他们可能会创建相同的 id。
  • 当然你是对的,我只是举一个我需要的例子。 ID 并不是我真正用于此问题的字段。这可能是一个不好的例子。谢谢

标签: sql ibm-midrange insert-into


【解决方案1】:

这可能有效

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      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     
      

      【讨论】:

      • @ehh 我的错。答案已更正。
      【解决方案4】:

      如果要插入具有唯一 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-13
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        相关资源
        最近更新 更多