Obě reakce mají možnosti. Jen pro trochu rozšíření možností ..
Možnost č. 1
KDYŽ mySQL podporuje určitý druh hašování, na základě řádků , můžete použít variantu návrh společnosti comodoro abyste se vyhnuli tvrdému smazání.
Identifikovat změněno
Chcete-li identifikovat změny, proveďte vnitřní spojení primárního klíče a zkontrolujte hodnoty hash. Pokud se liší, produkt byl změněn a měl by být aktualizován:
UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
SET p.ProductName = tmp.ProductName
, p.Stock = tmp.Stock
, ...
, p.DateLastChanged = now()
, p.IsDiscontinued = 0
WHERE tmp.TheRowHash <> p.TheRowHash
Identifikovat smazané
Použijte jednoduché vnější spojení k identifikaci záznamů, které v dočasné tabulce neexistují, a označte je jako „smazané“
UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
SET p.DateLastChanged = now()
, p.IsDiscontinued = 1
WHERE tmp.ProductID IS NULL
Identifikovat nové
Nakonec použijte podobný vnější spoj pro vložení jakýchkoli "nových" produktů.
INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
FROM Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
WHERE p.ProductID IS NULL
Možnost č. 2
Pokud není hašování na řádek proveditelné, alternativním přístupem je variace návrhu Sharondio .
Přidejte do dočasné tabulky sloupec „stav“ a pomocí řady spojení označte všechny importované záznamy jako „nové“, „změněné“ nebo „nezměněné“. (Výchozí nastavení by mělo být "změněno").
Identifikujte UN-Changed
Nejprve použijte vnitřní spojení ve všech polích k identifikaci produktů, které se NEZMĚNILY. (Upozorňujeme, že pokud tabulka obsahuje pole s možnou hodnotou null, nezapomeňte použít něco jako coalesce
Jinak mohou být výsledky zkreslené, protože null
hodnoty se nerovnají ničemu.
UPDATE Products_Temp tmp INNER JOIN Products p ON tmp.ProductID = p.ProductID
SET tmp.Status = 'Unchanged'
WHERE p.ProductName = tmp.ProductName
AND p.Stock = tmp.Stock
...
Identifikovat nové
Stejně jako dříve použijte k identifikaci „nových“ záznamů vnější spojení.
UPDATE Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
SET tmp.Status = 'New'
WHERE p.ProductID IS NULL
Procesem eliminace jsou všechny ostatní záznamy v dočasné tabulce "změněny". Jakmile spočítáte stavy, můžete aktualizovat tabulku Produkty:
/* update changed products */
UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
SET p.ProductName = tmp.ProductName
, p.Stock = tmp.Stock
, ...
, p.DateLastChanged = now()
, p.IsDiscontinued = 0
WHERE tmp.status = 'Changed'
/* insert new products */
INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
FROM Products_Temp tmp
WHERE tmp.Status = 'New'
/* flag deleted records */
UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
SET p.DateLastChanged = now()
, p.IsDiscontinued = 1
WHERE tmp.ProductID IS NULL