Отримати id після insert

Завдання. отримати ідентифікатор щойно доданої в таблицю записи.
Необхідна умова. в таблиці повинно бути AUTO_INCREMENT поле.

  1. Скинути (поміняти) значення Next Autoindex в MySQL: ALTER TABLE `table_name` AUTO_INCREMENT = 238;
  2. При виконанні INSERT запиту на додавання декількох записів (insert into `table_name` (field1, ..., fieldm) values ​​( 'value11', ..., 'value1m'), ..., ( 'valuen1', ..., 'valuenm');) MySQL як LAST_INSERT_ID повертає ідентифікатор першої вставленої записи. а не останньою, як можна було б припустити.
  3. У деяких версіях MySQL був баг. при неуспішному виконанні команди INSERT IGNORE (якщо унікальний ключ вже існує і нічого не додається) LAST_INSERT_ID повертає наступне доступне значення для авто-инкремента.
  4. Не застосовувати препарат LAST_INSERT_ID, коли його треба використовувати, не можна. Варіант "швиденько пишемо в базу і миттєво робимо SELECT максимального значення авто-инкремента" жахливий і нестабільний.

пиздец, як стало в нагоді.

Народ, а якщо 10-15 з'єднань. Ну тобто 10-15 чоловік працюють обновременно з базою. Є величезна ймовірність. що вони один за одним можуть зробити інсерт і дані будуть переплутані.

Саме тому треба використовувати LAST_INSERT_ID, а не 4-ий варіант.

Для MS SQL замість @@ IDENTITY краще використовувати SCOPE_IDENTITY (). Інакше перша ж вставка всередині тригера призведе до незрозумілих і трудновиявляемим помилок.

Кращий варіант - це
select max (id) from table;

varle. ваш варіант - це найкращий спосіб отримати чужий свежеполученний ID. Ніхто не гарантує, що між вашим insertом і selectом не влізе ще один insert. Здогадайтеся, чий ID вам поверне ваш max (id)

якщо робити вставку і select однієї транзакцією, тоді можна)

Для MS SQL.
Як варіант, можна (на додаток до "стандартного" Автоінкрементний ключу) створити доп. поле (varchar).
І ідентифікувати (по GUID) рядок по цьому полю:

create procedure [dbo]. [Str_GUID]
(
@sGUID varchar (50) OUTPUT
)
AS
BEGIN
/ *
Обчислити GUID і повернути його строкове представлення (без роздільників)
приклад:
DECLARE @Sx varchar (50)
Execute dbo.Str_GUID @Sx OUTPUT
select @Sx, len (@Sx)
* /
DECLARE @myid uniqueidentifier
SET @myid = NEWID ()
set @ sGUID = cast (@myid as varchar (50))
set @ sGUID = UPPER (rtrim (ltrim (REPLACE (@sGUID. '-', ''))))
RETURN
END

Leave a comment

Схожі статті