Логика запроса в MySQL

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 089
Благодарностей
126
Баллы
63
В базу пишется 2 поля/колонки - шифр заявки и ее текущий номер.
Каждый раз, первым запросом нужно вычислить максимальный номер заявки и увеличить его на 1 и тогда уже записать.

Но бывает когда шифр заявки вводится первый раз и тогда нужно присвоить ей значение 1 прежде чем это записать в базу.

SQL:
SELECT @A:=number+1 from Z_100
WHERE location_number='{-Variable.zayavka}'
ORDER BY number DESC
LIMIT 1;
INSERT INTO Z_100 (`location_number`,number) VALUES('{-Variable.zayavka}',@A);
 
Последнее редактирование:

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 089
Благодарностей
126
Баллы
63
Подсказали, что можно вот так:
SQL:
set @A = (
SELECT number+1 from Z_100 
WHERE location_number='{-Variable.zayavka}' 
ORDER BY number DESC 
LIMIT 1
);
INSERT INTO Z_100 (location_number,number) VALUES('{-Variable.zayavka}', ifnull(@A, 1));
 

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
Подсказали, что можно вот так:
SQL:
set @A = (
SELECT number+1 from Z_100
WHERE location_number='{-Variable.zayavka}'
ORDER BY number DESC
LIMIT 1
);
INSERT INTO Z_100 (location_number,number) VALUES('{-Variable.zayavka}', ifnull(@A, 1));
только для однопотока
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 089
Благодарностей
126
Баллы
63
только для однопотока
А если вот так:
SQL:
LOCK TABLES Z_100 WRITE;
set @A = (
SELECT number+1 from Z_100 
WHERE location_number='{-Variable.zayavka}' 
ORDER BY number DESC 
LIMIT 1
);
INSERT INTO Z_100 (location_number,number) VALUES('{-Variable.zayavka}', ifnull(@A, 1));
UNLOCK TABLES;
 

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
не
второй поток выполнит селект до завершения инсерта первым и получиться лажа

вкури:
уровни изоляции транзакций
хранимые процедуры

сделай хранимую процедуру, в ней одной транзакцией выполни оба запроса и забудь про локи как страшный сон
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)