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!
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;
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;
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í:
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
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.
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