BEWERKEN:
Bewerkt na commentaar van een gebruiker op dit bericht:
U hebt schrijftabelvergrendeling nodig op beide van deze twee processen.
Een WRITE-slot heeft de volgende kenmerken:
-
De enige sessie die de vergrendeling van een tabel bevat, kan gegevens uit de tabel lezen en schrijven.
-
Andere sessies kunnen geen gegevens lezen van en schrijven naar de tabel totdat de WRITE-vergrendeling is opgeheven.
Kijk ook naar SQL UNIQUE Constraint
VOOR BEWERKEN:
Ja, het is mogelijk. En het duurde even voor ik het doorhad. Ik bouw dit op uw invoer- en vergelijkende waarden als test1, test2 enz., Waar test altijd hetzelfde is en een volgnummer heeft. Zoals je hebt aangegeven.
Het kan worden gedaan als MySQL TRANSACTION in 4 stappen.
Stel dat u tabel testT
. heeft waarbij de naam uniek is om te verzekeren dat we geen dubbels hebben.
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
En je wilt een nieuw item invoegen met de naam test1 die we hebben ingesteld als:
SET @newName = 'test1';
Dan moeten we controleren of het al in de tabel bestaat:
SELECT @check:=COUNT(*) FROM testT WHERE name = @newName;
We tellen hier om waar of onwaar te krijgen en slaan het op als @check
hier zodat we het later kunnen vergelijken. Dit resulteert in 1 row
als test1
bestaat al in de tabel.
Vervolgens doen we nog een selectie om het hoogste aantal tests* te krijgen en deze op te slaan als @number
, deze volgende query selecteert alle tests en doet een SUBSTRING na 4 laatste's die ons alle nummers geven na de eerste 4 laatste's. (999999999999) nummers eigenlijk om er zeker van te zijn dat we er geen missen, maar in ons geval is het resultaat slechts "3" omdat dat het laatste record is "test3
" in tabel.
SELECT
@number:= SUBSTRING(name,5,99999999999)
FROM testT;
Nu kunnen we een invoeging doen:
INSERT INTO testT(name)
VALUES
(
IF(@check = "", @newName , CONCAT(LEFT(@newName,4),RIGHT(@number,1)+1)
)
);
Dit probeert onze @newName
. in te voegen in tabel onder ALS voorwaarde, en dat is als onze @check
leeg is, zal hij @newName
invoegen , zo niet, dan wordt de woordtest uit de tekenreeks gehaald en wordt een hoogste @number
toegevoegd van eerder en voeg +1 ook toe.
Dus resultaat voor @newName = 'test1'
is beneden. Als je dit verandert in @newName = 'test3'
resultaat zou hetzelfde zijn nieuwe insert test4
.
**Schema (MySQL v5.7)**
SET @newName = 'test1';
---
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test4 |
---
En als u het in ELKE test* wijzigt dat nummer nog niet bestaat, wordt het normaal ingevoegd. In het onderstaande geval:@newName = 'test6'
SET @newName = 'test6';
**Query #1**
SELECT * FROM testT
ORDER BY id;
| id | name |
| --- | ----- |
| 1 | test1 |
| 2 | test3 |
| 3 | test6 |
Zo wordt er altijd een insert gemaakt.
Je kunt hier mee spelen:Bekijken op DB Fiddle
gewoon door SET @newName = 'test6'
. te wijzigen
Ik ben geen expert en het kostte me een paar uur om deze uitweg te vinden, omdat ik wilde weten of dit zelfs mogelijk was. En ik zou het op prijs stellen als een andere gebruiker een andere manier kan voorstellen of mijn methode kan verbeteren.