如何为插入mysql的每一行更新子查询?

时间:2012-04-30 19:10:39

标签: mysql insert max subquery

我的查询如下:

INSERT INTO table1 (lfd, somedata)
select (select max(lfd) + 1 from table1), somedata from table2

Table2有多行。所以我想在table1中插入多行。 这可行,但lfd设置为所有插入行的相同数字。

因此,如果插入的第一行的max(ldf)+ 1为“2”,则对于所有后续行,它也是“2”。这是不正确的,因为下一行的max(lfd)+ 1当然应该返回“3”。

如何告诉mysql重新评估每个插入的子查询?

我无法触及表结构,因为我将数据从一个php-gallery迁移到另一个不同的php-gallery。表格的结构在应用程序的控制之下。

在Oracle中,我只需定义一个序列并在子选择中选择squeencename.nextval。 - 我很确定这会起作用,但据我所知,mysql不提供序列,对吧?

2 个答案:

答案 0 :(得分:0)

只需将lfd定义为autoincrement column即可。那么你就不必费心去做select max(...) ...

这是一种不同的方式:

insert into table1 (lfd, somedata)
select 
  (
    select count(*) + (select count(*) from table1) 
    from table2 l
    where l.lfd <= r.lfd
  ),
  r.somedata
from table2 r;

这是如何运作的:

  1. table2中的行从1到n进行排名(其中n是table2中的行数)
  2. 将最初的max(lfd)添加到排名中,以便值将是唯一的
  3. 警告:这是一个n ** 2查询,所以如果你有一个大数据集,这可能需要一段时间。

答案 1 :(得分:0)

尝试一次:

SELECT MAX(lfd) + 1 INTO @i FROM table1;

INSERT INTO table1 (lfd,col1,...)
SELECT @i:=@i+1,somedata,... FROM SomeTable;

基本上这只会使用一个变量作为序列,用表中当前的最大id初始化它。

请注意,如果在此查询运行时将行插入table1,则可能会出现并发问题。