(My) SQL: получить новые идентификаторы в «INSERT INTO ... SELECT» - PullRequest
1 голос
/ 22 апреля 2011

Мне нужно вставить в одну таблицу записи, выбранные из другой таблицы, и (затем) обновить первую таблицу сгенерированным идентификатором для второй. Как я могу это сделать?

* 1003 Е.Г. *

input_table:

input_table:  code  new_id
               aa    NULL
               bb    NULL


output_table:  id(auto_increment)  code
                ...                ... 

SQL:

INSERT INTO output_table (code) SELECT code FROM input_table;

UPDATE input_table "WITH THE NEW IDS"

Результат:

input_table:   code  new_id
                aa    100
                bb    101

output_table:   id   code
                ...  ...
                100  aa
                101  bb

По нескольким причинам я не могу полагаться на уникальность code в output_table.

Есть подсказка?

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

Я не думаю, что приведенные выше ответы безопасны для нескольких пользователей.Если вам нужен параллельный доступ, я предлагаю отказаться от автоинкремента и использовать собственную последовательность для идентификаторов.К сожалению, в MySQL отсутствует CREATE SEQUENCE, но вы можете смоделировать его с помощью функций, поддерживаемых скрытой таблицей последних значений.(Не забудьте полностью заблокировать таблицу во время выполнения функции, чтобы несколько пользователей получили разные идентификаторы.) Затем получите новый идентификационный номер из функции any, передавая его в операторы INSERT и UPDATE.

Некоторые диалекты поддерживают INSERT ... RETURNING <column value>, но MySQL не может.

1 голос
/ 22 апреля 2011
set @max_orig_id = coalesce((select max(id) from output_table),0);
insert into output_table (code) select code from input_table;
update input_table join output_table on input_table.code=output_table.code and output_table.id > @max_orig_id set input_table.new_id=output_table.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...