Autor Téma: vložení dat bez duplicit  (Přečteno 1437 krát)

Offline jnovacek

  • Příspěvků: 10
  • Karma: 1
    • Verze Delphi: Delphi 7
vložení dat bez duplicit
« kdy: 19-03-2014, 23:02:26 »
Ahoj všem,
mám tabulku v MySQL se sloupcem, který je unique. Do této tabulky může přijít cokoliv a občas se stane, že se tam chce vložit řádek, který má tuto položku shodnou. Jak ošetřím to, abych se do databáze nesnažil vkládat již vložená data? Snažil jsem se vymyslet SQL dotaz, ale opět dělám něco špatně. Toto nefunguje:
'INSERT INTO listen (ReceiveData) VALUES ("'+sData+'") WHERE (SELECT COUNT(*) FROM listen WHERE ReceiveData="'+sData+'"=0)'
Dá se to nějak takhle řešit? Jak upravit SQL dotaz nebo se to dělá úplně nějak jinak? Nebo se dá nastavit MySQL server tak, aby nově vkládané nejedinečné řádky ignoroval?
Předem děkuji
D7

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1839
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:vložení dat bez duplicit
« Odpověď #1 kdy: 20-03-2014, 07:33:01 »
mám tabulku v MySQL se sloupcem, který je unique. Do této tabulky může přijít cokoliv a občas se stane, že se tam chce vložit řádek, který má tuto položku shodnou. Jak ošetřím to, abych se do databáze nesnažil vkládat již vložená data? Snažil jsem se vymyslet SQL dotaz, ale opět dělám něco špatně. Toto nefunguje:
'INSERT INTO listen (ReceiveData) VALUES ("'+sData+'") WHERE (SELECT COUNT(*) FROM listen WHERE ReceiveData="'+sData+'"=0)'
Dá se to nějak takhle řešit? Jak upravit SQL dotaz nebo se to dělá úplně nějak jinak? Nebo se dá nastavit MySQL server tak, aby nově vkládané nejedinečné řádky ignoroval?
Prikaz INSERT zadnou klauzuli WHERE nema (jak muzes konstruovat nejaky prikaz, kdyz neznas jeho syntaxi :o): http://dev.mysql.com/doc/refman/5.6/en/insert.html. Moznosti mas nekolik a zalezi, co od toho chces a v jak izolovane transakci to ma bezet, ale v podstate:
  • select si udelat na klientovi napred a insert nedelat, pokud zaznam existuje
  • dtto, jen to strcit do SP, aby to nemusel kazdy klient resit. Byva dobrym zvykem si ke kazde tabulce udelat SP N_<table>
  • pokud to nepobezi s exclusive isolation, tak v except vzdy jeste chytat unique constraint violation
  • pouzit  INSERT IGNORE
  • nahradit INSERT za REPLACE s tim, ze se hodnoty ostatnich sloupcu prepisou
  • pridat prikazu INSERT klauzuli ON DUPLICATE KEY UPDATE .... s tim, ze si prepises jen sloupce, ktere te zajimaji
« Poslední změna: 20-03-2014, 07:34:37 od pf1957 »

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: