Begge svar har muligheder. Bare for at udvide dine muligheder lidt ..
Mulighed #1
HVIS mySQL understøtter en form for hashing, på en række-basis , kan du bruge en variant af comodoros forslag for at undgå svære sletninger.
Identificer ændret
For at identificere ændringer skal du lave en indre joinforbindelse på den primære nøgle og kontrollere hashværdierne. Hvis de er forskellige, er produktet blevet ændret og bør opdateres:
OPDATERING Produkter 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
Identificer slettet
Brug en simpel ydre joinforbindelse til at identificere poster, der ikke findes i den midlertidige tabel, og markér dem som "slettet"
OPDATERING Produkter p LEFT JOIN Products_Temp tmp ON tmp.ProductID =p.ProductID SET p.DateLastChanged =now() , p.IsDiscontinued =1 WHERE tmp.ProductID IS NULL
Identificer ny
Brug endelig en lignende ydre samling til at indsætte eventuelle "nye" produkter.
INSERT INTO Products ( Produktnavn, Lager, DateLastChanged, IsDiscontinued, .. ) SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ... FROM Products_Temp tmp LEFT JOIN Products ON tmp.ProductID =p.ProductID WHERE p.ProductID IS NULL
Valgmulighed #2
Hvis hashing pr. række ikke er mulig, er en alternativ tilgang en variation af Sharondios forslag .
Tilføj en "status"-kolonne til den midlertidige tabel og markér alle importerede poster som "nye", "ændrede" eller "uændrede" gennem en række joinforbindelser. (Standarden skal "ændres").
Identificer FN-ændret
Brug først en indre sammenføjning på alle felter for at identificere produkter, der IKKE er ændret. (Bemærk, hvis din tabel indeholder nullbare felter, husk at bruge noget som sammensmelte
Ellers kan resultaterne blive skæve, fordi null
værdier er ikke lig med noget.
OPDATERING Products_Temp tmp INNER JOIN Produkter p ON tmp.ProductID =p.ProductID SET tmp.Status ='Uændret' HVOR p.ProductName =tmp.ProductName AND p.Stock =tmp.Stock ...
Identificer ny
Som før skal du bruge en ydre sammenføjning til at identificere "nye" poster.
OPDATERING Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID =p.ProductID SET tmp.Status ='Ny' WHERE p.ProductID IS NULL
Ved elimineringsproces bliver alle andre poster i temp-tabellen "ændret". Når du har beregnet statusserne, kan du opdatere produkttabellen:
/* opdater ændrede produkter */ OPDATERING Produkter 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 ='Ændret' /* indsæt nye produkter */ INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. ) SELECT tmp.ProductStock, . , now() AS DateLastChanged, 0 AS IsDiscontinued, ... FROM Products_Temp tmp WHERE tmp.Status ='New' /* flag slettede poster */ 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