WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Säker query? (https://www.wn.se/forum/showthread.php?t=1048028)

hoover 2011-05-05 12:39

Säker query?
 
Hej,
Jag vill rensa upp min databas och ta bort rader som inte är relaterade till andra tabeller, typ:

DELETE FROM tableB WHERE id NOT IN(SELECT id FROM tableA)

Min fråga är om ovanstående Query är "säker"?
Finns det tex någon risk att "DELETE FROM tableB WHERE id NOT IN()" exekveras, men inte "SELECT id FROM tableA"... vilket skulle få det katastrofala resultatet att hela tableB raderas.

Om risk finns. Vad är det bättre sättet att göra samma sak?

Ara 2011-05-05 12:47

vad är det för databas?

begin tran
DELETE FROM tableB WHERE id NOT IN(SELECT id FROM tableA)
titta om det ser bra ut.
commit tran

gör som om du är osäker

coredev 2011-05-05 12:49

Ja, den är säker - men läskig. Lätt att göra fel. Vad händer t.ex. om du av misstag råkar ändra något i den inre sql-frågan som gör att den inte retunerar något?

Det är förmodligen säkrare att loopa igenom rad för rad, även om det tar otroligt mycket längre tid. En annan lösning är att hämta en lista med alla id-nummer som skall bort, kolla att listan inte är överdrivet lång och sedan köra delete where in...

Ara 2011-05-05 12:56

Citat:

Ursprungligen postat av coredev (Inlägg 20404346)
Ja, den är säker - men läskig. Lätt att göra fel. Vad händer t.ex. om du av misstag råkar ändra något i den inre sql-frågan som gör att den inte retunerar något?

Det är förmodligen säkrare att loopa igenom rad för rad, även om det tar otroligt mycket längre tid. En annan lösning är att hämta en lista med alla id-nummer som skall bort, kolla att listan inte är överdrivet lång och sedan köra delete where in...

Ju mer "manuellt arbete" ju större är risken till fel, anser jag. Kör du det i en transaktion är du väldigt säker.

hoover 2011-05-05 13:01

Tack för bra svar.
Det är en MySQL-databas. Jag kommer inte ändra den inre frågan, skriptet kommer köras som ett cronjob. Så om "Hela frågan eller INGET körs" så vågar jag nog ha det som ovan.

Det är ganska många tabeller som ska rensas, och jag kommer att köra skriptet/frågorna dagligen för att hålla databasen så ren som möjligt. (strukturen är kass, men det är inget jag vill/kan göra något åt nu)

col 2011-05-05 14:03

Det är ju aldrig fel att göra en backup av databasen innan upprensningen sker :)

hoover 2011-05-05 14:36

Citat:

Ursprungligen postat av col (Inlägg 20404366)
Det är ju aldrig fel att göra en backup av databasen innan upprensningen sker :)

Det kommer jag under alla omständigheter att göra :)


Alla tider är GMT +2. Klockan är nu 19:51.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson