在具有多行的INSERT上生成MAX(field1)+1

时间:2013-01-04 19:55:39

标签: mysql

我有这张桌子(称之为tableA):

id (PK, autoincrement)
field1 (integer)
field2 (integer)

我想从另一个表中插入一些记录,如下所示:

INSERT INTO tableA (field1, field2)
SELECT *something*, tableB.field2
FROM tableB;

现在,我需要的是field1在每一行填写一个新的整数,类似于id填充的方式(类似" MAX(field1)+1" )。有没有办法做到这一点,也许使用子查询?

2 个答案:

答案 0 :(得分:1)

我不是100%确定此处没有任何并发​​问题,但我会从这样的触发器开始:

CREATE TRIGGER ins_your_table BEFORE INSERT ON your_table 
FOR EACH ROW
  SET new.field1=case when new.field1 is null then
      coalesce((select max(field1)+1 from your_table),1)
    else new.field1 end
;

insert into your_table (field1, field2) values (10, 1),(11, 2),(12, 3);

select * from your_table;

| ID | FIELD1 | FIELD2 |
------------------------
|  1 |     10 |      1 |
|  2 |     11 |      2 |
|  3 |     12 |      3 |

delete from your_table;

insert into your_table (field1, field2) values (10, 1),(11, 2),(12, 3);
insert into your_table (field2) values (4),(5),(6);

select * from your_table;

| ID | FIELD1 | FIELD2 |
------------------------
|  1 |     10 |      1 |
|  2 |     11 |      2 |
|  3 |     12 |      3 |
|  4 |     13 |      4 |
|  5 |     14 |      5 |
|  6 |     15 |      6 |

查看this fiddle上的一些示例。

答案 1 :(得分:0)

我想出了这个:

SET @newVAL = (SELECT MAX(field1) FROM tableA);
INSERT INTO tableA (field1, field2)
SELECT @newVAL := @newVAL+1, tableB.field2
FROM tableB

我们的想法是首先获取field1的MAX值,将其存储在变量中,然后在每个选定的行上增加它。