sql >> Database >  >> RDS >> Mysql

mysql Bij Dubbele waarde in veld, voeg nieuwe rij in met nieuwe waarde

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.




  1. Gegevens en schema migreren van MySQL naar SQL Server

  2. Generate_series in Postgres vanaf begin- en einddatum in een tabel

  3. Hoe MYSQL-queryresultaten ORDER BY-voorwaarden te maken?

  4. MySQL-opgeslagen procedure die string met meerdere parameters accepteert