MYSQL: Comment copier une ligne entière d’une table à une autre dans mysql avec la seconde table ayant une colonne supplémentaire?

J’ai deux tables avec une structure identique sauf pour une colonne … Le tableau 2 a cette colonne supplémentaire dans laquelle je voudrais insérer le CURRENT_DATE ()

Je voudrais copier toutes les valeurs de table1 à table2.

si j’utilise

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5; 

il génère une erreur indiquant la différence entre le nombre de colonnes.

J’ai deux questions à ce sujet:

  1. Comment puis-je contourner cela?
  2. et comment puis-je append la valeur de la colonne de date supplémentaire (CURRENT_DATE ()) dans la table 2 dans cette même instruction?

Pour affiner la réponse de Zed, et pour répondre à votre commentaire:

 INSERT INTO dues_storage SELECT d.*, CURRENT_DATE() FROM dues d WHERE id = 5; 

Voir le commentaire de TJ Crowder

Le moyen le plus sûr de le faire est de spécifier complètement les colonnes à la fois pour l’insertion et l’extraction. Il n’ya aucune garantie (à l’application) que l’une ou l’autre de celles-ci sera l’ordre que vous pensez pouvoir être.

 insert into dues_storage (f1, f2, f3, cd) select f1, f2, f3, current_date() from dues where id = 5; 

Si vous craignez de devoir changer plusieurs pages PHP qui le font (comme vous semblez l’indiquer dans le commentaire, vous avez une autre réponse), c’est prêt pour une procédure stockée. De cette façon, toutes vos pages PHP appellent simplement la procédure stockée avec (par exemple) uniquement l’ID à copier et contrôlent le processus de copie réel. De cette façon, il n’ya qu’un seul endroit où vous devez maintenir le code et, à mon avis, le SGBD est le bon endroit pour le faire.

 INSERT INTO dues_storage SELECT field1, field2, ..., fieldN, CURRENT_DATE() FROM dues WHERE id = 5; 

J’espère que cela aidera quelqu’un … Voici un petit script PHP que j’ai écrit au cas où vous auriez besoin de copier des colonnes mais pas d’autres, et / ou les colonnes ne sont pas dans le même ordre sur les deux tables. Tant que les colonnes portent le même nom, cela fonctionnera. Donc, si la table A a [userid, handle, something] et que la tableB a [userID, handle, timestamp], alors vous “SELECTez userID, handle, NOW () comme horodatage FROM tableA”, puis obtenez le résultat, et transmettre le résultat comme premier paramètre à cette fonction ($ z). $ toTable est un nom de chaîne pour la table dans laquelle vous copiez et $ link_identifier est la firebase database dans laquelle vous copiez. Ceci est relativement rapide pour les petits ensembles de données. Il n’est pas conseillé d’essayer de déplacer plus de quelques milliers de lignes à la fois de cette manière dans un paramètre de production. Je l’utilise principalement pour sauvegarder les données collectées lors d’une session lorsqu’un utilisateur se déconnecte, puis effacer immédiatement les données de la firebase database live pour les garder minces.

  function mysql_multirow_copy($z,$toTable,$link_identifier) { $fields = ""; for ($i=0;$i0) { $fields .= ","; } $fields .= mysql_field_name($z,$i); } $q = "INSERT INTO $toTable ($fields) VALUES"; $c = 0; mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. ! while ($a = mysql_fetch_assoc($z)) { foreach ($a as $key=>$as) { $a[$key] = addslashes($as); next ($a); } if ($c>0) { $q .= ","; } $q .= "('".implode(array_values($a),"','")."')"; $c++; } $q .= ";"; $z = mysql_query($q,$link_identifier); return ($q); } 

Vous pouvez également utiliser les requêtes internes pour le faire.

 SQL> INSERT INTO  SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM ); 

J’espère que cela t’aides!

 SET @sql = CONCAT( 'INSERT INTO  (', ( SELECT GROUP_CONCAT( CONCAT('`',COLUMN_NAME,'`') ) FROM information_schema.columns WHERE table_schema =  AND table_name =  AND column_name NOT IN ('id') ), ') SELECT ', ( SELECT GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`')) FROM information_schema.columns WHERE table_schema =  AND table_name =  AND column_name NOT IN ('id') ),' from  WHERE  = ' ); PREPARE stmt1 FROM @sql; execute stmt1; 

Bien sûr, remplacez les valeurs <> par des valeurs réelles et surveillez vos devis.

Je voulais juste append ce petit extrait qui fonctionne à merveille pour moi.

INSERT INTO_tget_table SELECT * FROM your_rescource_table WHERE id = 18;

Et pendant que j’y suis, donnez un grand coup à Sequel Pro, si vous ne l’utilisez pas, je vous recommande fortement de le télécharger … rend la vie beaucoup plus facile