хранимая процедура MySQL - Как получить последний идентификатор вставки - PullRequest
0 голосов
/ 12 мая 2018

Я создал одну хранимую процедуру, которая вставляет запись в таблицу и получает автоматически увеличенный идентификатор этой записи ... Здесь я получаю синтаксическую ошибку при установке LAST_INSERT_ID () в переменную ...

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '); SET _orderId = SELECT LAST_INSERT_ID (); END 'в строке 5

Пожалуйста, помогите мне решить эту проблему ... Заранее спасибо ...

Мой код, как показано ниже,

delimiter //

    CREATE PROCEDURE placeOrder(IN _cartId INT,IN _createdBy INT)
    BEGIN

    DECLARE _orderId INT;

    -- insert into order
    INSERT INTO `TBL_ORDER`(`DealerId`, `OrderNo`, `CreatedBy`) VALUES ((SELECT DealerId FROM TBL_SHOPPING_CART WHERE Id =  _cartId),UNIX_TIMESTAMP(),_createdBy)); 
    SET _orderId = SELECT LAST_INSERT_ID();

    END//

    delimiter ;

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Попробуйте это.

delimiter //
CREATE PROCEDURE placeOrder(IN _cartId INT,IN _createdBy INT)
BEGIN
SET @orderId = '';
-- insert into order
INSERT INTO `TBL_ORDER`(`DealerId`, `OrderNo`, `CreatedBy`) VALUES ((SELECT DealerId FROM TBL_SHOPPING_CART WHERE Id =  _cartId),UNIX_TIMESTAMP(),_createdBy)); 

SELECT LAST_INSERT_ID() INTO @orderId;


END//

delimiter ;

OR

delimiter //
    CREATE PROCEDURE placeOrder(IN _cartId INT,IN _createdBy INT)
    BEGIN

    -- insert into order
    INSERT INTO `TBL_ORDER`(`DealerId`, `OrderNo`, `CreatedBy`) VALUES ((SELECT DealerId FROM TBL_SHOPPING_CART WHERE Id =  _cartId),UNIX_TIMESTAMP(),_createdBy); 

SELECT LAST_INSERT_ID() AS '_orderId ';


END//

delimiter ;
0 голосов
/ 12 мая 2018

Вы должны убедиться, что ваше приложение не имеет глобального подключения или общего подключения.Так как last_insert_it() вернет последнее сгенерированное значение AI , оно может быть из любой таблицы.Особенно, если ваше хост-приложение использует асинхронные ЗАДАЧИ

Concider по следующему сценарию

  1. Ваше приложение каждую секунду сохраняет местоположение GPS => генерирует новое значение AI
  2. Вы пытаетесь вышеSP для вставки значения => Генерация нового значения AI
  3. Между вставкой и чтением last_insert_id ваше приложение снова регистрирует местоположение GPS и создает новое значение AI.
  4. Теперь угадайте, что происходит?Вы получаете последний вставленный идентификатор из таблицы gps, а не от своего SP.

обычно вставки выполняются быстро, но предполагается, что ваш SP должен был ждать блокировки таблицы и получил задержку.В этом случае вы получите неправильный идентификатор.

Самым безопасным способом может быть инкапсуляция вашей работы SP в транзакции и получение максимального значения вашего столбца AI (при условии, что это столбец AI без знака).

0 голосов
/ 12 мая 2018

Попробуйте:

...
-- SET _orderId = SELECT LAST_INSERT_ID();
SET _orderId = LAST_INSERT_ID();
SELECT _orderId;
...

или

...
-- SET _orderId = SELECT LAST_INSERT_ID();
SET _orderId = (SELECT LAST_INSERT_ID());
SELECT _orderId;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...