Пересмотреть подзапрос MySQL для каждого INSERT - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь дублировать строки в той же таблице. Таблица 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) рассчитывается один раз, поэтому он всегда будет возвращать один и тот же идентификатор. При вставке второй строки запрос не будет выполнен (повторяется первичный ключ).

Сначала я попробовал:

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, поэтому нет гарантии, что я получу неиспользуемый идентификатор.

Как я могу перейти к:

  • Иметь подзапрос, который пересчитывается для каждого INSERT
  • Или, в более общем случае: повторяющиеся строки в моей таблице, если нет auto_increment

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Вы пробовали использовать переменные?

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 голос
/ 30 декабря 2011

Основываясь на комментариях, я считаю, что это будет работать тогда.Хитрость в том, что вы не можете использовать +1, как вы нашли (если вы не используете переменные), но вы можете использовать существующий идентификатор и добавить его к максимальному значению, которое будет давать вам уникальный идентификатор каждый раз.

INSERT INTO A (id, foreign_id, value)
    SELECT (SELECT MAX(id) FROM A)+ID, 2, value
        FROM A WHERE foreign_id = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...