webForumDet fria alternativet

Endast köra om alla sql-satser kan utföras

PHP

14 svar · 794 visningar · startad av Trankan

Medlem sedan okt. 2006129 inlägg
Frågan#1

Hej!

Jag har en funktion som flyttar en bestämd rad från en databastabell till en annan. Det innebär att jag måste ha tre sql-sater. Först hämtar jag den rad jag vill flytta, sedan lägger jag till raden i den andra tabellen och slutligen tar jag bort raden från den första tabellen. Jag vill att att denna funktion ska köras endast om alla tre sql-satserna kan utföras, för att undvika att till exempel raden tas bort utan att först läggas till i den andra tabellen. Går det här att lösa?

Medlem sedan juni 20014 421 inlägg
#2

Kör du mysql bör du titta på att använda InnoDB som motor då den har stöd för transaktioner. Då kan du utföra alla dina frågor och om något går fel så gör du en rollback annars en commit.

Medlem sedan dec. 200012 464 inlägg
#3

Använd transaktioner.

begin
     declare exit handler for sqlexception rollback;
     start transaction;
     insert into t2 select <kolumner> from t1 where <villkor>;
     delete from t1 where <villkor>;
     commit;
end
Medlem sedan okt. 2006129 inlägg
#4

Finns det någonstans där man kan läsa mer om transaktioner? Har inte använt det tidigare.

Medlem sedan juni 20014 421 inlägg
Medlem sedan okt. 2006129 inlägg
#6

Tack för länken. Allra helst skulle jag vilja fortsätta med MyISAM som jag använt hittills, men då går problemet inte att lösa kanske?

Medlem sedan juni 20014 421 inlägg
#7

MyISAM har inte transaktionsstöd. Du förlorar egentligen inget på att gå över tilll InnoDB heller. Då du även får stöd för foreign keys. Vill du prompt göra det i MyISAM får du skriva logiken själv vilket kommer vara jobbigt, svårt och onödigt.

Medlem sedan okt. 2006129 inlägg
#8

Okej, med det räcker väl med att använda InnoDB för just de tabeller som jag vill ska ha stöd för transaktioner? Har tittat lite i phpMyAdmin, men i listan där man väljer lagringsmotor för en tabell finns inte InnoDB med. Känner någon igen det här och vet vad det kan bero på?

Medlem sedan jan. 2004140 inlägg
#9

Om jag inte misstar mig så ska väl även MyISAM ha stöd för FK? Eller är det jag som är ute och cyklar? Vill minnas att jag har använt FK i MyISAM..

Medlem sedan dec. 200012 464 inlägg
#10

Du misstar dig.

Det går att ange foreign key när man skapar tabellen men den appliceras inte.

Medlem sedan okt. 2006129 inlägg
#11

Kom på en sak nu som jag glömde att nämna tidigare. Förrutom att de tre sql-satserna ska köras så ska även en mapp på FTP:n skapas, och om inte allt detta kan utföras så ska inte funktionen köras. Det måste ju göra allting mycket krångligare. :l

Medlem sedan jan. 2004140 inlägg
#12

Ok, du har säkert rätt. Är väl det jag gjort, applicera FK i MyISAM innan jag gick över till innoDB av andra anledningar.
Då har man lärt sig något nytt idag med, sicken grej! :)

Medlem sedan mars 20034 471 inlägg
#13

Trankan skrev:

Kom på en sak nu som jag glömde att nämna tidigare. Förrutom att de tre sql-satserna ska köras så ska även en mapp på FTP:n skapas, och om inte allt detta kan utföras så ska inte funktionen köras. Det måste ju göra allting mycket krångligare. :l

Ja, det blir det. För så vitt jag förstår kan inte databasen veta om FTP:andet funkat eller ej. Och då löser inte transaktioner problemet.

Medlem sedan juni 20014 421 inlägg
#14

Det är ju bara att skapa den innan du ska köra sql-satserna, går inte mappan att skapa så hoppar du bara över det hela.

Medlem sedan okt. 2006129 inlägg
#15

Jo det förstås, men då skapas ju mappen oavsett om sql-satserna körs eller inte.

264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)