MySQL: ¿Cómo insertar un registro para cada resultado en una consulta SQL?


Digamos que tengo un select

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

Que devuelve algunos registros.

¿Cómo puedo hacer un insert para reach row en el conjunto de resultados como

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

Donde @id y @customer_id son los campos de la fila en el conjunto de resultados?

Editar: No quería simplemente duplicarlo, sino insertar un nuevo valor en el campo domain en su lugar. Sin embargo una facepalm-situación ya que es simplemente fácil; -) Gracias!

Author: acme, 2011-03-09

5 answers

Tan simple como esto:

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

Si quieres" www.example.com " como dominio, puedes hacer:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;
 126
Author: krtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 14:55:23
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;
 6
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 14:58:30
INSERT INTO Config (id, customer_id, domain)
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config

La documentación de MySQL para esta sintaxis está aquí:

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

 5
Author: Jeff Fritz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 14:56:05

EDITAR- Después de leer el comentario en la respuesta de @Krtek.

Supongo que estás pidiendo una actualización en lugar de insertar-

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

Esto actualizará todos los registros existentes en la tabla de configuración con dominio como 'www.example.com' sin crear ninguna entrada duplicada.

ANTIGUA RESPUESTA -

Puedes usar algo como -

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

Nota: - Esto no funcionará si tiene id como clave primaria

 3
Author: Sachin Shanbhag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 14:56:44

Ejecute esta instrucción SQL:

-- Do nothing.

Desea seleccionar filas distintas de "config" e insertar esas mismas filas en la misma tabla. Ya están ahí. Nada que hacer.

A menos que realmente solo desee actualizar algunos o todos los valores en la columna "dominio". Eso requeriría una declaración de ACTUALIZACIÓN que realmente hizo algo.

 -4
Author: Mike Sherrill 'Cat Recall',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 15:01:16