Case: I was building a CLI script to aggregate data from one MySql database and write results to another MySql database using 2 open db-connections. This way the script’s execution time was in the some-minutes-range… not good! I tried a more effective attempt: I let the CLI script output all necessary statements to drop and create all needed tables and fill them with insert-statements. I called it like this from the command line and diverted output to a file:
$ php aggregatData.php > all_sql_i_need.sql
I could then import the whole thing in one go into my target database like this:
$ mysql the_dbname -h localhost -uMarco -pPass < all_sql_i_need.sql
Insight: The execution-time was way better than my first attempt and took only seconds. I could also have combined the two lines in a shell-script.
The problem with the generated SQL statements was, that the data also contained relations between primary and foreign keys of records and that these IDs were generated at import-time by auto_increment fields. I solved this issue by using MySql variables which can be set and use d again like this:
INSERT INTO gruppen (name) VALUES ('Gruppe 1'); SET @temp_gruppe_id = LAST_INSERT_ID(); INSERT INTO gruppe_eigenschaften (id_gruppe, name, wert) VALUES (@temp_gruppe_id, 'email1', 'firstname.lastname@example.org');
The variable @temp_gruppe_id is set and can be used in the subsequent SQL statements. It also worked in MySql4.
Here is an example of SQL statements illustrating this mechanism in the above mentioned script. You can cut-and-paste it into your PhpMyAdmin.