2016-01-19 2 views
0

У меня есть запрос SQL, который выбирает серийный номер и затем сразу увеличивает порядковый номер. Проблема в том, что когда я запускаю оператор, select возвращает обновленный серийный номер после приращения. Я ожидаю, что он вернет серийный номер перед обновлением, а затем выполнит обновление и установит новый серийный номер.SELECT возвращает обновленное значение во время транзакции SELECT-UPDATE

Ниже SQL:

START TRANSACTION; 

    -- Let's get the current value 
    SELECT serial FROM boxLabelSerial FOR UPDATE; 

    -- Increment the counter 
    UPDATE boxLabelSerial SET serial = serial + 1; 

    COMMIT; 

Спасибо.

+0

Используйте 'identity'. Не заново изобретайте колесо. –

+0

Хороший обзор этого можно найти на DBA SE http://dba.stackexchange.com/questions/46459/putting-a-select-statement-in-a-transaction – gabe3886

ответ

1

Но, если вы собираетесь изобретать колесо, вам нужно «переносить» значение из тонального заявления в другое. Переменная является одним из способов сделать это:

START TRANSACTION; 

    -- Let's get the current value 
    SELECT @s := serial FROM boxLabelSerial FOR UPDATE; 

    -- Increment the counter 
    UPDATE boxLabelSerial SET serial = @s + 1; 

COMMIT; 

Примечание: ваш подход работает только если предположить, что boxLabelSerial имеет ровно одну строку.

+1

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

0
START TRANSACTION; 

UPDATE boxLabelSerial SET LAST_INSERT_ID(serial) = serial + 1; 
SELECT LAST_INSERT_ID() FOR UPDATE; 

COMMIT; 
Смежные вопросы