» »

[MariaDB] Odkritje današnjega dne: INSERT IGNORE INTO

[MariaDB] Odkritje današnjega dne: INSERT IGNORE INTO

HotBurek ::

Dobro jutro.

Evo, fantje in dekline, nov dan in nov izziv ter rešitev.

Skratka, imam (postavil bom) setup, kjer bo več različnih procesov vnašalo podatke v isto tabelo. Rečmo, da so ti podatki "keyword-i".

In sem študiral, kako naredit, da bo čim manj raznih lock-v, ali pa deadlock-v, restart transaction in teh ne bodi ga treba dogodkov.

Ena od opcij, ki sem si jo zamislil, je, da bi tabeli dodal dodaten stolpec, ki bi predstavljal process_id, hrakti pa bi ta stolpecv bil del PRIMARY key-a. In pri vnosu bi vsak process vnesel tudi svoj process id. Tako da če bi dva procesa ob istem času vnesla isti keyword, bi to moralo iti "skos" brez problemov.
Kasneje, ko bi podatke bral, bi naredil group by "keyword" in prišel do željenih podatkov. Namreč, izvor (process_id) keyword-a mi ni pomemben, pomembno je samo dobiti seznam teh keyword-ov.

No, potem pa sem se odpravil na spletna mesta, in našel, da obstaja ukaz INSERT IGNORE INTO. Top!

Ugotovitve:

- INSERT IGNORE INTO dela kot je opisano: error zamolči, warning-a pa ne. Zato je v output-u vedno message-: Duplicate entry 'la-la' for key PRIMARY. Krneki.
- REPLACE INTO dela točno tisto, kar sem iskal. Če recorda ni, ga inserta, če je, ga updejta. Sam update mi ni pomemben, ker prepisujem isto z istim. Malo me moti, ker beseda REPLACE sama po sebi ni dovolj jasna, če se bo zgodil insert podatkov ob predpostaviki, da še ne obstajajo v tabeli. No, ta insert se zgodi.
- INSERT INTO ... ON DUPLICATE KEY UPDATE... Ta ukaz je z največ tipkanja. Mogoče bi prišel prav, kjer je treba neko vrednost (za nek id) prepisovat z zadnjo. Ne vem točno.

Po strokovnem posvetu z vedeževalko, mislim da se bom odločil za uporabo REPLACE INTO.

Vir 1: https://stackoverflow.com/questions/136...
Vir 2: https://bogdan.org.ua/2007/10/18/mysql-...
Vir 3: https://dev.mysql.com/doc/refman/8.0/en...

In ja: Well done.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
  • spremenilo: HotBurek ()

HotBurek ::

Še mini dodatek.

User, ki izvaja REPLACE INTO, med drugim potrebuje DELETE permissions-e na tabeli. Zgleda, kot da ta ukaz naredi DELETE + INSERT. Ne vem...
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

OracleDev ::

A tebe še niso odpustil?

FireSnake ::

Burek spet trola! Neverjetno.

Burek, kaj misliš, da si ti prvi na svetu s podobnim "problemom"?

Povej nam: kaj si na to temo izbrskal do zdaj? Ker tehnično gledano je tople popolnoma mimo.

Kako si se lotil ti rečem lahko samo: well (this is absolutely not how it should be) done.

P.S. sploh tale, da bi process ID bil primary key je dobra fora za nasmejati. No, iz tehničnega vidika bi bilo smešno, če ne bi bilo žalostno.
Poglej in se nasmej: vicmaher.si

Zgodovina sprememb…

  • spremenilo: FireSnake ()

Rias Gremory ::

@burek
Mimogrede, svojo spletno stran blog lahko postaviš za 0€ na https://pages.github.com/
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Mariadb (InnoDB) istočasni insert v tabelo iz različnih procesov (strani: 1 2 )

Oddelek: Programiranje
877301 (3659) 2g00d4u
»

SQL vprasanje (strani: 1 2 )

Oddelek: Programiranje
688345 (5024) BivšiUser2
»

PostgreSQL pomoč

Oddelek: Programiranje
162503 (1996) Mato989
»

SQL težava

Oddelek: Programiranje
365149 (4431) joseti

Več podobnih tem