R: [Db] mysql spostare record tra due tabelle

Domenico L. domenico.lorusso a pleiade.it
Gio 14 Giu 2007 09:03:53 CEST


giuseppe a arsnet.it ha scritto:
> Cristiano Verondini wrote:
>
>   
>> Purtroppo, AFAIK, questo è l'unico metodo. Aggiungerei un LOCK delle
>> tabelle prima delle operazioni per evitare che mentre stai facendo la copia
>> vengano inseriti altri record. Se non ci sono errori, la procedura non ha
>> problemi. Se ci sono errori sarebbe meglio avere un motore DB col rollback.
>>     
>
>   Ho trovato una mezza soluzione:
>
> “INSERT INTO storico_ordini (ordine_id,data,id_anacf,numero)
> SELECT ordine_id,data,id_anacf,numero
> FROM ordini”
> "delete from ordini where ordine_id in (select ordine_id from storico
> _ordini) "
>   
Non ho le specifiche di mysql ma temo ch questa soluzione alla lunga ti 
darà problemi perché la delete non rimuove lo spazio occupato mentre la 
truncate sì.

La prima soluzione da te proposta è quella corretta, non ci possono 
essere errori in una insert....select
è un'istruzione atomica e come tale o va tutta a buon fine o non ci va.

I punti su cui devi prestare attenzione sono:
- Mettere in transazione
- Lock di tabella per evitare inserimenti nel mentre stai storicizzando 
i dati
- Eventuli trigger sulla tabella di storico.

Se poi vuoi (in pseudo codice):
lock
begin transaction

select .... insert

select p.id
from produzione p left join storico s on (p.id=s.id)
where s.id is null

#se questa query torna qualcosa hai avuto un problema!

end transaction
truncate produzione
unlock



ciao

-- 
Domenico L.        	 icq: 645 44 861 - msn: strahd a jumpy.it

per stupire mezz'ora basta un libro di storia,
io cercai di imparare la Treccani a memoria... [F.d.A.]




Maggiori informazioni sulla lista Db