UPRAVIT:
Upraveno po komentáři uživatele k tomuto příspěvku:
Potřebujete uzamykání tabulky zápisu na obou těchto dvou procesech.
Zámek WRITE má následující vlastnosti:
-
Jediná relace, která drží zámek tabulky, může číst a zapisovat data z tabulky.
-
Jiné relace nemohou číst data z tabulky a zapisovat data do tabulky, dokud není uvolněn zámek WRITE.
Podívejte se také na JEDINEČNÉ omezení SQL
PŘED ÚPRAVOU:
Ano, je to možné. A chvíli mi trvalo, než jsem na to přišel. Stavím to na vašich vstupních a porovnávacích hodnotách jako test1, test2 atd., kde je test vždy stejný a má koncové číslo. Jak jsi uvedl.
Lze to provést jako TRANSAKCE MySQL ve 4 krocích.
Řekněme, že máte tabulku testT
kde je jméno jedinečné, abychom se ujistili, že nemáme dvojníky.
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
A chcete vložit novou položku s názvem test1, který jsme nastavili jako:
SET @newName = 'test1';
Potom musíme zkontrolovat, zda již existuje v tabulce:
SELECT @check:=COUNT(*) FROM testT WHERE name = @newName;
Zde provedeme počet, abychom získali hodnotu true nebo false, a uložíme jej jako @check
zde, abychom to mohli později porovnat. Výsledkem bude 1 row
jako test1
již v tabulce existuje.
Dále provedeme další výběr, abychom získali nejvyšší počet testů* a uložili jej jako @number
, tento další dotaz vybere všechny testy a provede SUBSTRING po 4 posledně jmenovaných, což nám dá všechna čísla po prvních 4 posledně jmenovaných. (99999999999) čísla vlastně jen pro jistotu, aby nám žádná neunikla, ale v našem případě je výsledek pouze "3", protože to je poslední záznam "test3
" v tabulce.
SELECT
@number:= SUBSTRING(name,5,99999999999)
FROM testT;
Nyní můžeme provést vložení:
INSERT INTO testT(name)
VALUES
(
IF(@check = "", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)
)
);
Toto se pokusí vložit náš @newName
do tabulky pod podmínkou IF, a to je-li naše @check
je prázdné, pak vloží @newName
, pokud ne, odebere slovo test z řetězce a připojí nejvyšší @number
z dříve a přidejte k tomu + 1.
Takže výsledek pro @newName = 'test1'
je níže. Pokud toto změníte na @newName = 'test3'
výsledek by byl stejný nový vložte test4
.
**Schema (MySQL v5.7)**
SET @newName = 'test1';
---
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test4 |
---
A pokud jej změníte v JAKÉKOLIV testu*, které číslo ještě neexistuje, vloží ho normálně. V případě níže:@newName = 'test6'
SET @newName = 'test6';
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test6 |
Tímto způsobem bude vždy vytvořena vložka.
S tím si můžete hrát zde:Zobrazit na DB Fiddle
stačí změnit SET @newName = 'test6'
Nejsem žádný odborník a trvalo mi několik hodin, než jsem se z toho dostal, protože jsem chtěl vědět, jestli je to vůbec možné. A ocenil bych, kdyby jakýkoli jiný uživatel mohl navrhnout jiný způsob nebo zlepšit moji metodu.