web-dev-qa-db-fra.com

MySQL: Comment insérer un enregistrement pour chaque résultat dans une requête SQL?

Dis que j'ai un choix

SELECT DISTINCT id, customer_id, domain FROM config WHERE type = 'foo';

qui renvoie des enregistrements.

Comment puis-je faire un insert pour la ligne de portée dans le jeu de résultats comme

INSERT INTO config (id, customer_id, domain) VALUES (@id, @customer_id, 'www.example.com');

@id et @customer_id sont les champs de la ligne dans le jeu de résultats?

edit: je ne voulais pas simplement le dupliquer, mais insérer une nouvelle valeur dans le champ domain à la place. Néanmoins, une situation face à face car c'est tout simplement facile ;-) Merci!

76
acme

Aussi simple que cela:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, domain FROM config;

Si tu veux "www.example.com "comme domaine, vous pouvez faire:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;
143
krtek
INSERT INTO config (id, customer_id, domain)
SELECT id, customer_id, 'www.example.com' FROM (
  SELECT DISTINCT id, customer_id, domain FROM config
  WHERE type = 'foo'
) x;
7
Ken
INSERT INTO Config (id, customer_id, domain)
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config

La documentation MySQL pour cette syntaxe est ici:

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

5
Jeff Fritz

MODIFIER - Après avoir lu le commentaire sur la réponse de @ Krtek.

Je suppose que vous demandez une mise à jour au lieu d'insérer -

update config set domain = 'www.example.com'

Cela mettra à jour tous les enregistrements existants dans la table de configuration avec le domaine comme "www.example.com" sans créer de doublons.

ANCIENNE RÉPONSE -

vous pouvez utiliser quelque chose comme -

INSERT INTO config (id, customer_id, domain)
select id, customer_id, domain FROM config

Remarque: - Cela ne fonctionnera pas si vous avez id comme clé primaire

4
Sachin Shanbhag