Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql При Дублиране на стойност в поле, вмъкнете нов ред с нова стойност

РЕДАКТИРАНЕ:

Редактирано след потребителски коментар за тази публикация:

Имате нужда от заключване на таблицата за запис и на двата процеса.

Заключването WRITE има следните характеристики:

  • Единствената сесия, която държи заключването на таблица, може да чете и записва данни от таблицата.

  • Други сесии не могат да четат данни от и да записват данни в таблицата, докато не се освободи заключването WRITE.

Вижте също SQL UNIQUE ограничение

ПРЕДИ РЕДАКТИРАНЕ:

Да, възможно е. И ми отне известно време, за да го разбера. Изграждам това върху вашите входни данни и съпоставящи стойности като test1, test2 и т.н., където тестът винаги е един и същ и има краен номер. Както посочихте.

Може да се направи като MySQL TRANSACTION в 4 стъпки.

Да приемем, че имате таблица testT където името е уникално, за да гарантираме, че нямаме двойници.

<предварителен код>| ID | име || --- | ----- || 1 | тест1 || 2 | тест3 |

И искате да вмъкнете нов елемент с име 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'

Аз не съм експерт и ми отне няколко часа, за да разбера този изход, тъй като исках да знам дали това е възможно. И ще се радвам, ако някой друг потребител може да предложи друг начин или да подобри моя метод.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавяне на подзаявка към вече гигантска заявка

  2. Matlab и MySQL не е намерен подходящ драйвер

  3. Fluent NHibernate не може да зареди MySql.Data от GAC в режим на отстраняване на грешки на тест

  4. SQL връща 100 произволни реда за всяка възраст

  5. защо това ляво присъединяване връща само един запис?