3

我的查询如下所示:

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 不提供序列,对吧?

4

2 回答 2

0

只需定义lfd自动增量列。那么你就不必费心了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. 从 1 到 n对行进行排名table2(其中 n 是 中的行数table2
  2. 将初始值添加max(lfd)到等级中,因此值将是唯一的

注意事项:这是一个 n**2 查询,所以如果你有一个大数据集,这可能需要一段时间。

于 2012-04-30T19:16:40.360 回答
0

试试这个:

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

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

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

table1请注意,如果在此查询运行时插入行,您可能会遇到并发问题。

于 2012-04-30T19:55:46.133 回答