Copier des lignes dans MySQL

je veux copier toutes les colonnes d'une rangée, mais je n'ai pas à spécifier chaque colonne. Je suis au courant de la syntaxe à http://dev.mysql.com/doc/refman/5.1/en/insert-select.html mais je ne vois aucun moyen d'ignorer une colonne.

pour mon exemple, j'essaie de copier toutes les colonnes d'une rangée vers une nouvelle rangée, à l'exception de la clé primaire.

Est-il un moyen de le faire sans avoir à écrire la requête avec tous les champs?

14
demandé sur Taryn 2008-10-23 18:38:58

7 réponses

si votre id ou colonne de la clé primaire est une auto_increment , vous pouvez utiliser une table de température:

CREATE TEMPORARY TABLE temp_table 
AS 
SELECT * FROM source_table WHERE id='7'; 
UPDATE temp_table SET id='100' WHERE id='7';
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;

ainsi, de cette façon, vous pouvez copier toutes les données dans la ligne id='7' et ensuite affecter nouvelle valeur '100' (ou n'importe quelle valeur se situe au-dessus de la plage de votre valeur auto_ increment actuelle dans source_table).

Edit: l'Esprit ; après les relevés :)

16
répondu Lore 2012-03-15 16:24:15

vous devrez énumérer les colonnes que vous voulez sélectionner si vous ne les sélectionnez pas toutes. Copier/Coller est votre ami.

3
répondu Josh Bush 2008-10-23 14:43:09

c'est un script PHP que j'ai écrit pour faire ceci, il supposera que votre première colonne est votre incrément automatique.

$sql = "SELECT * FROM table_name LIMIT 1"; 
$res = mysql_query($sql) or die(mysql_error());
for ($i = 1; $i < mysql_num_fields($res); $i++) {
     $col_names .= mysql_field_name($res, $i).", ";
 }
 $col_names = substr($col_names, 0, -2);

$sql = "INSERT INTO table_name (".$col_names.") SELECT ".$col_names." FROM table_name WHERE condition ";
$res = mysql_query($sql) or die(mysql_error());
2
répondu Casey 2011-06-10 16:38:51

si vous ne spécifiez pas les colonnes vous devez garder les entrées dans l'ordre. Par exemple:

INSERT INTO `users` (`ID`, `Email`, `UserName`) VALUES
(1, 'so@so.com', 'StackOverflow')

fonctionnerait mais

INSERT INTO `users` VALUES
('so@so.com', 'StackOverflow')

placerait L'Email à la colonne ID pour qu'il ne soit pas bon.

essayez d'écrire les colonnes une fois comme:

INSERT INTO `users` (`Email`, `UserName`) VALUES
('so@so.com', 'StackOverflow'),
('so2@so.com', 'StackOverflow2'),
('so3@so.com', 'StackOverflow3'),
etc...

je pense qu'il y a une limite au nombre de lignes que vous pouvez insérer avec cette méthode.

1
répondu Eric Lamb 2008-10-23 14:46:04

non, ce n'est pas possible.

mais il est facile d'obtenir la liste de la colonne et de supprimer qui vous ne voulez pas copié ce processus peut également être fait à travers le code, etc.

1
répondu Mischa Kroon 2008-10-23 14:57:17

copiez la table à une nouvelle, puis supprimez la colonne que vous ne voulez pas. Simple.

1
répondu Jamie Williamson 2011-12-13 05:23:03

je suppose que puisque vous voulez omettre la clé primaire que c'est une colonne auto_increment et vous voulez MySQL pour autogénérer la valeur suivante dans la séquence.

étant Donné que, en supposant que vous n'avez pas besoin d'effectuer des insertions par l'insertion dans ... sélectionnez la méthode suivante pour les inserts à enregistrement simple/multi:

insérer dans mytable (null, 'A',' b',' c');

Où la première colonne est votre auto_incremented clé primaire et les autres sont vos autres colonnes de la table. Lorsque MySQL voit un null (ou 0) pour une colonne auto_incremented , il remplacera automatiquement le null par la prochaine valeur valide (voir ce lien pour plus d'informations). Cette fonctionnalité peut être désactivée en désactivant le mode sql NO_AUTO_VALUE_ON_ZERO décrit dans ce lien.

dites-moi si vous avez des questions.

- Dipine

0
répondu Dipin 2009-03-20 21:24:39