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?
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.
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
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.
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å?
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
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! :)
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.