FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Nykomling
|
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? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Bara ett inlägg till!
|
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 |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Bara ett inlägg till!
|
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... |
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Bara ett inlägg till!
|
Citat:
|
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Nykomling
|
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) |
||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Medlem
|
Det är ju aldrig fel att göra en backup av databasen innan upprensningen sker
![]() |
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Nykomling
|
|||
![]() |
![]() |
Svara |
|
|