我的查询如下:
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不提供序列,对吧?
答案 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;
这是如何运作的:
table2
中的行从1到n进行排名(其中n是table2
中的行数)max(lfd)
添加到排名中,以便值将是唯一的警告:这是一个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
,则可能会出现并发问题。