为每个INSERT重新评估MySQL子查询

时间:2011-12-30 11:16:34

标签: mysql subquery

我正在尝试在同一个表格中重复行。表A有没有auto_increment (不幸的是)。

INSERT INTO A (id, foreign_id, value)
    SELECT (SELECT MAX(id)+1 FROM A), 2, value
        FROM A WHERE foreign_id = 1;

(SELECT MAX(id)+1 FROM A)计算一次,因此它将始终返回相同的ID。在第二行插入时,查询将失败(重复的主键)。

我先尝试过:

INSERT INTO A (id, foreign_id, value)
    SELECT MAX(id)+1, 2, value
        FROM A WHERE foreign_id = 1;

MAX(id)+1会考虑WHERE foreign_id = 1,因此我无法保证会获得未使用的ID。

我该如何进行:

  • 为每个INSERT
  • 设置一个重新计算的子查询
  • 或者更一般地说:假设没有auto_increment
  • ,我的表中会有重复的行

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用变量?

SET @max=SELECT MAX(id);
INSERT INTO A (id, foreign_id, value)
    SELECT @max:=@max+1, 2, value
        FROM A WHERE foreign_id = 1;

答案 1 :(得分:1)

根据评论,我相信这会有用。 诀窍是您不能使用+1(除非您使用变量),但您可以使用现有ID并将其添加到最大值,每次都会为您提供唯一ID。

INSERT INTO A (id, foreign_id, value)
    SELECT (SELECT MAX(id) FROM A)+ID, 2, value
        FROM A WHERE foreign_id = 1;