Geef aan dat de tabellen exact dezelfde kolommen hebben, je kunt zoiets als dit doen:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
INSERT INTO NEW_TABLE (SELECT * FROM OLD_TABLE);
COMMIT ;
Ik heb wat aanvullende uitleg toegevoegd op basis van Wistar's opmerking. De leesniveaus die hier kunnen worden gebruikt zijn:
- LEES TOEGEVOEGD :Een enigszins Oracle-achtig isolatieniveau met betrekking tot consistente (niet-vergrendelende) leesbewerkingen:elke consistente leesbewerking, zelfs binnen dezelfde transactie, stelt en leest zijn eigen nieuwe momentopname
- LEES NIET-TOEGANG :SELECT-instructies worden uitgevoerd op een niet-vergrendelende manier, maar een mogelijke eerdere versie van een rij kan worden gebruikt. Bij gebruik van dit isolatieniveau zijn dergelijke uitlezingen dus niet consistent. Dit wordt ook wel een dirty read genoemd. Anders werkt dit isolatieniveau als LEES TOEGEWIJD.
- HERHAALBAAR LEZEN :Dit is het standaard isolatieniveau voor InnoDB. Voor consistente leesbewerkingen is er een belangrijk verschil met het isolatieniveau READ COMMITTED:alle consistente leesbewerkingen binnen dezelfde transactie lezen de momentopname die is gemaakt door de eerste leesbewerking. Deze conventie betekent dat als u meerdere gewone (niet-vergrendelende) SELECT-instructies binnen dezelfde transactie afgeeft, deze SELECT-instructies ook met elkaar consistent zijn.
- SERIALISEERBAAR :Dit niveau is als HERHAALBAAR LEZEN, maar InnoDB converteert impliciet alle gewone SELECT-instructies naar SELECT ... LOCK IN SHARE MODE als autocommit is uitgeschakeld. Als autocommit is ingeschakeld, is de SELECT zijn eigen transactie. Het is daarom bekend dat het alleen-lezen is en kan worden geserialiseerd als het wordt uitgevoerd als een consistente (niet-vergrendelende) leesbewerking en niet hoeft te worden geblokkeerd voor andere transacties. (Om een gewone SELECT te forceren om te blokkeren als andere transacties de geselecteerde rijen hebben gewijzigd, schakelt u autocommit uit.)
Ik hoop dat dit helpt.