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?
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 :)
vous devrez énumérer les colonnes que vous voulez sélectionner si vous ne les sélectionnez pas toutes. Copier/Coller est votre ami.
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());
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.
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.
copiez la table à une nouvelle, puis supprimez la colonne que vous ne voulez pas. Simple.
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