Tabel snel ontdubbelen
Ik heb een database die vanaf verschillende kanten door dezelfde data wordt gevoed.
Dit heeft er mee te maken dat alles door kan draaien als 1 bron uitvalt.
Ik update vanuit de verschillende bronnen met ODBC.
Dan krijgt je dus elke melding meerdere keren in de database.
De meldingen gaan per (ongeveer) 20 per minuut in de database.
In de ODBC heb ik het volgende als Initial Statement het volgende ingevuld om te ontdubbelen:
DELETE t1 FROM tabel1 t1
INNER JOIN tabel2 t2
WHERE
t1.id < t2.id AND
t1.veld1 = t2.veld1 AND
t1.veld2 = t2.veld2;
Dat doet zijn werk prima.
Van alles wat dubbel is bewaart hij de nieuwste (aan de hand van de id).
Maar dit zijn zoveel vergelijkingen elke keer dat hij daar elke keer 7 seconden mee bezig is.
Het is natuurlijk onzin dat hij elke keer weer volledig de hele tabel door gaat terwijl als je de laatste 100 nieuwe records zou pakken het ook goed gaat (de andere, oudere records zijn al een keer ontdubbelt).
Maar hoe voeg je hier een LIMIT of MAX toe?
Daarbij wil ik niet maximaal een bepaald aantal records wissen maar een maximaal aantal records doorzoeken.
Wie weet hoe dit werkt?
Dit heeft er mee te maken dat alles door kan draaien als 1 bron uitvalt.
Ik update vanuit de verschillende bronnen met ODBC.
Dan krijgt je dus elke melding meerdere keren in de database.
De meldingen gaan per (ongeveer) 20 per minuut in de database.
In de ODBC heb ik het volgende als Initial Statement het volgende ingevuld om te ontdubbelen:
DELETE t1 FROM tabel1 t1
INNER JOIN tabel2 t2
WHERE
t1.id < t2.id AND
t1.veld1 = t2.veld1 AND
t1.veld2 = t2.veld2;
Dat doet zijn werk prima.
Van alles wat dubbel is bewaart hij de nieuwste (aan de hand van de id).
Maar dit zijn zoveel vergelijkingen elke keer dat hij daar elke keer 7 seconden mee bezig is.
Het is natuurlijk onzin dat hij elke keer weer volledig de hele tabel door gaat terwijl als je de laatste 100 nieuwe records zou pakken het ook goed gaat (de andere, oudere records zijn al een keer ontdubbelt).
Maar hoe voeg je hier een LIMIT of MAX toe?
Daarbij wil ik niet maximaal een bepaald aantal records wissen maar een maximaal aantal records doorzoeken.
Wie weet hoe dit werkt?
In plaats van records met nieuwe data toe te voegen en vervolgens records met oude data te wissen, zou je met INSERT ON DUPLICATE KEY UPDATE bestaande records kunnen wijzigen met de nieuwe data.
En als een record niet bestaat wordt een nieuw record toegevoegd.
https://www.plus2net.com/sql_tutorial/sql_update-on-duplicate-key.php
En als een record niet bestaat wordt een nieuw record toegevoegd.
https://www.plus2net.com/sql_tutorial/sql_update-on-duplicate-key.php
Dank voor je reactie.
De applicatie die de records toevoegt, daar heb ik geen invloed op.
Er draaien nu twee van deze applicaties (om meer zekerheid te hebben) en die geven dezelfde data in dezelfde database en tabel. Alleen de id verschil dan dus. Vandaar dat ik extern moet gaan ontdubbelen.
De applicatie die de records toevoegt, daar heb ik geen invloed op.
Er draaien nu twee van deze applicaties (om meer zekerheid te hebben) en die geven dezelfde data in dezelfde database en tabel. Alleen de id verschil dan dus. Vandaar dat ik extern moet gaan ontdubbelen.
Ik geloof dat het correcte antwoord van Adoptive Solution niet helemaal over is gekomen.
Overigens gaan we er maar van uit dat je de database MySQL gebruikt, omdat dit de meest voorkomende is.
Wanneer je een andere gebruikt (MariaDB, PostgreSQL, mssql, etc.) laat het ons weten.
In jouw werkende voorbeeld controleer je op 't1.veld1 = t2.veld1 AND t1.veld2 = t2.veld2'. Je wilt dat deze aan elkaar gelijk zijn omdat ze maar één keer voor mogen komen in de tabel. Een database kan automatisch voorkomen dat er dubbele gegevens worden ingevoerd met een UNIQUE index:
Vervolgens kan de database er voor zorgen dat, wanneer je deze gegevens probeert dubbel op te slaan, de overige gegevens uit de rij worden bijgewerkt, maar NIET de dubbele:
Als je de INSERT-query echt niet kunt (laten) aanpassen, dan wordt het ingewikkelder.
Je kunt een BEFORE INSERT TRIGGER aanmaken, die de functionaliteit van ON DUPLICATE KEY UPDATE nadoet.
Kijk hier naar: https://www.mysqltutorial.org/mysql-triggers/mysql-before-insert-trigger .
Er staat een voorbeeld onder 'Creating BEFORE INSERT trigger example' dat redelijk eenvoudig is aan te passen.
Overigens gaan we er maar van uit dat je de database MySQL gebruikt, omdat dit de meest voorkomende is.
Wanneer je een andere gebruikt (MariaDB, PostgreSQL, mssql, etc.) laat het ons weten.
In jouw werkende voorbeeld controleer je op 't1.veld1 = t2.veld1 AND t1.veld2 = t2.veld2'. Je wilt dat deze aan elkaar gelijk zijn omdat ze maar één keer voor mogen komen in de tabel. Een database kan automatisch voorkomen dat er dubbele gegevens worden ingevoerd met een UNIQUE index:
Vervolgens kan de database er voor zorgen dat, wanneer je deze gegevens probeert dubbel op te slaan, de overige gegevens uit de rij worden bijgewerkt, maar NIET de dubbele:
Als je de INSERT-query echt niet kunt (laten) aanpassen, dan wordt het ingewikkelder.
Je kunt een BEFORE INSERT TRIGGER aanmaken, die de functionaliteit van ON DUPLICATE KEY UPDATE nadoet.
Kijk hier naar: https://www.mysqltutorial.org/mysql-triggers/mysql-before-insert-trigger .
Er staat een voorbeeld onder 'Creating BEFORE INSERT trigger example' dat redelijk eenvoudig is aan te passen.




