sql >> Databáze >  >> RDS >> Mysql

mysql Na Duplikovat hodnotu v poli vložte nový řádek s novou hodnotou

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.




  1. Query zamyká tabulky, nemůže tento proces zabít

  2. Jak vytvořím koláčový graf, který zobrazuje množství něčeho, co každý registroval?

  3. Zploštění protínajících se časových úseků

  4. Jak mohu použít spouštěče PostgreSQL k ukládání změn (příkazy SQL a změny řádků)