РЕДАКТИРАНЕ:
Редактирано след потребителски коментар за тази публикация:
Имате нужда от заключване на таблицата за запис и на двата процеса.
Заключването WRITE има следните характеристики:
-
Единствената сесия, която държи заключването на таблица, може да чете и записва данни от таблицата.
-
Други сесии не могат да четат данни от и да записват данни в таблицата, докато не се освободи заключването WRITE.
Вижте също SQL UNIQUE ограничение
ПРЕДИ РЕДАКТИРАНЕ:
Да, възможно е. И ми отне известно време, за да го разбера. Изграждам това върху вашите входни данни и съпоставящи стойности като test1, test2 и т.н., където тестът винаги е един и същ и има краен номер. Както посочихте.
Може да се направи като MySQL TRANSACTION в 4 стъпки.
Да приемем, че имате таблица testT
където името е уникално, за да гарантираме, че нямаме двойници.
И искате да вмъкнете нов елемент с име test1, което сме задали, е като:
SET @newName ='test1';
След това трябва да проверим дали вече съществува в таблицата:
ИЗБЕРЕТЕ @check:=БРОЙ(*) ОТ testT WHERE име =@новоИме;
Ние правим броене тук, за да получим вярно или невярно и да го запазим като @check
тук, за да можем да го сравним по-късно. Това ще доведе до 1 ред
като test1
вече съществува в таблицата.
След това правим друга селекция, за да получим най-голям брой тестове* и да го съхраняваме като @number
, тази следваща заявка избира всички тестове и прави SUBSTRING след 4 последните, като ни дава всички числа след първите 4 последни. (99999999999) числа всъщност само за да сме сигурни, че няма да пропуснем нито едно, но в нашия случай резултатът е само "3", защото това е последният запис "test3
" в таблицата.
SELECT @number:=SUBSTRING(име,5,99999999999) ОТ testT;
Сега можем да направим вмъкване:
INSERT INTO testT(name)VALUES( IF(@check ="", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)));код>
Това се опитва да вмъкне нашия @newName
в таблица при условие IF, а това е ако нашият @check
е празен, тогава той ще вмъкне @newName
, ако не, ще извади текстовия тест от низа и ще добави най-висок @number
от по-рано и добавете + 1 също.
Така че резултат за @newName ='test1'
е по-долу. Ако промените това в @newName ='test3'
резултатът ще бъде същият нов вмъкване test4
.
**Схема (MySQL v5.7)** SET @newName ='test1'; ---**Заявка #1** ИЗБЕРЕТЕ * ОТ testT ПОРЪЧАЙТЕ ПО id;| ID | име || --- | ----- || 1 | тест1 || 2 | тест3 || 3 | test4 |---
И ако го промените в НИКАКЪВ тест* този номер вече не съществува, той ще го вмъкне нормално. В случай по-долу:@newName ='test6'
SET @newName ='test6'; **Запитване №1** ИЗБЕРЕТЕ * ОТ testT ПОРЪЧАЙТЕ ПО идентификатор; | ID | име | | --- | ----- | | 1 | тест1 | | 2 | тест3 | | 3 | test6 |
По този начин винаги ще се прави вложка.
Можете да играете с това тук :Преглед на DB Fiddle
просто като промените SET @newName ='test6'
Аз не съм експерт и ми отне няколко часа, за да разбера този изход, тъй като исках да знам дали това е възможно. И ще се радвам, ако някой друг потребител може да предложи друг начин или да подобри моя метод.