Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Далее можно получать следующий ID из нужной последовательности с помощью функцииВо-первых, функция last_insert_id тут не нужна, можно и сразу с полем работать. В ряде случаев это выйдет даже экономичнее.
last_insert_id():
UPDATE `sequence` SET `some_other_id` = last_insert_id(`some_other_id` + 1);
SELECT last_insert_id();
А что вы имеете ввиду под «сразу с полем работать»?Например, так:
UPDATE `sequence` SET `some_other_id` = `some_other_id`+1;
SELECT `some_other_id` FROM `sequence`;
Или так:UPDATE `sequence` SET `some_other_id` = `some_other_id`+1;
INSERT INTO `some_other_table` (id, textfield) SELECT `some_other_id`, 'какой-то текст' FROM `sequence`;
Второй случай экономичнее, т.к. требует на один запрос меньше.Да, в моем примере блокировка записи будет.Тут я, кстати, не совсем прав. Если включен автокоммит (а это по умолчанию) и если дело не происходит в рамках явно начатой транзакции, то блокировка будет довольно короткая, только на время самого UPDATE-а. Т.е. скорее всего, она будет некритична.
Автоинкремент стал 5, хотя вставки не было. А что будет с MyISAM:
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted. See Section 13.2.5, “INSERT Syntax”.
Источник.You can use REPLACE instead of INSERT to overwrite old rows. REPLACE is the counterpart to INSERT IGNORE in the treatment of new rows that contain unique key values that duplicate old rows: The new rows are used to replace the old rows rather than being discarded.
Источник.хотя следить за ним иногда бывает нужно, например, после вставки записи и сразу за этим следующим добавлением данных в связанную таблицу уже с foreign key.
Несколько заметок о MySQL