INSERT INTO… SELECT pour toutes les colonnes MySQL

J’essaie de déplacer les anciennes données de:

this_table >> this_table_archive 

copier toutes les colonnes. J’ai essayé ceci, mais ça ne marche pas:

 INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00'); 

Note: les tables sont identiques et ont un id défini comme clé primaire.

La syntaxe correcte est décrite dans le manuel . Essaye ça:

 INSERT INTO this_table_archive (col1, col2, ..., coln) SELECT col1, col2, ..., coln FROM this_table WHERE entry_date < '2011-01-01 00:00:00'; 

Si les colonnes id sont une colonne auto-incrémentée et que vous avez déjà des données dans les deux tables, vous pouvez dans certains cas omettre l'id de la liste des colonnes et générer de nouveaux identifiants pour éviter d'insérer un identifiant existant dans l'original. table. Si votre table cible est vide, cela ne posera pas de problème.

Pour la syntaxe, cela ressemble à ceci (laisser de côté la liste des colonnes pour signifier implicitement “tous”)

 INSERT INTO this_table_archive SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00' 

Pour éviter les erreurs de clé primaire si vous avez déjà des données dans la table d'archivage

 INSERT INTO this_table_archive SELECT t.* FROM this_table t LEFT JOIN this_table_archive a on a.id=t.id WHERE t.entry_date < '2011-01-01 00:00:00' AND a.id is null # does not yet exist in archive 

Ajout à Mark Byers répondre:

Parfois, vous souhaitez également insérer des détails codés en dur, sinon une contrainte unique peut échouer, etc. Utilisez-les donc dans une telle situation où vous remplacez certaines valeurs des colonnes.

 INSERT INTO masortingmony_domain_details (domain, type, logo_path) SELECT 'www.example.com', type, logo_path FROM masortingmony_domain_details WHERE id = 367 

Ici , la valeur du domaine est ajoutée par moi-même de la manière Hardcoded pour se débarrasser de la contrainte Unique.

n’avez-vous pas besoin de double () pour le bit de valeurs? sinon essayez ceci (bien qu’il y ait une meilleure façon

 insert into this_table_archive (id, field_1, field_2, field_3) values ((select id from this_table where entry_date < '2001-01-01'), ((select field_1 from this_table where entry_date < '2001-01-01'), ((select field_2 from this_table where entry_date < '2001-01-01'), ((select field_3 from this_table where entry_date < '2001-01-01'));