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


84

Di que tengo una selección

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

que devuelve algunos registros.

¿Cómo puedo hacer una inserción para la fila de alcance en el conjunto de resultados como

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

¿Dónde @idy @customer_idestán 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. Sin embargo, una situación de facepalm, ya que es muy fácil ;-) ¡Gracias!


¿Quiere duplicar los registros que seleccionó?
ethrbunny

¿Por qué vuelve a insertar los registros de la misma tabla en la misma tabla? Esto creará duplicados
Sachin Shanbhag

Lo siento chicos, esta pregunta fue bastante estúpida, solo estaba atrapado con un problema muy simple facepalm
acme

Todo el mundo necesita un amigo que responda a sus preguntas de vez en cuando. Por su esfuerzo otorgo
Jeff Fritz

Tengo el mismo problema. Por ejemplo, de la forma en que está diseñada la tabla, necesito replicar las entradas de otros usuarios, pero hay 356 registros que necesito replicar a un nuevo usuario.
Casey

Respuestas:


161

Tan simple como esto:

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

Si desea " www.example.com" como dominio, puede hacer:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;

1
Pero esto no inserta un nuevo registro domainestablecido en 'www.example.com', simplemente duplica todas las entradas.
acme

Tienes razón, es tan simple como esto, una solución simple a un problema simple facepalm Gracias ;-)
acme

Solo iba a escribir uniones complicadas para archivar esto, ja. ¡Muchas gracias! No podría ser más fácil.
C4d

2
Le has guardado a mi equipo editorial algunas semanas de cambios de plantilla sin sentido :-)
Artem Ankudovich

@ArtemAnkudovich me alegro de poder ser de ayuda :)
krtek

7
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;

1
no es necesario realizar una subconsulta como esta. Compruebe las otras respuestas
krtek

Krtek: ¿Qué respuesta, exactamente, sugieres? Veo otras 4 respuestas y cada una es incorrecta de alguna manera.
Ken

¿De qué manera están mal? Al menos mi segunda consulta y la de Jeff Fritz tienen los mismos resultados que la suya.
krtek

1
Krtek: si la tabla tiene registros (1,1, "a", "foo") y (1,1, "b", "foo"), la primera consulta de la pregunta devuelve (1,1, "a "), (1,1," b "), por lo que, como se le preguntó, el registro (1,1," example.com ") debe insertarse dos veces. Su respuesta es distinta con la cadena literal "ejemplo.com", por lo que (1,1, "ejemplo.com") solo se inserta una vez.
Ken

5
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


Gracias, pero no quería duplicar cada campo, el campo 'dominio' debería ser diferente. Pero, sin embargo, es simple y me quedé atrapado con este estúpido problema.
acme

4

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

Supongo que está solicitando 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 el dominio como 'www.example.com' sin crear entradas duplicadas.

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 una identificación como clave principal


Gracias, pero no quería duplicar cada campo, el campo 'dominio' debería ser diferente. Pero, sin embargo, es simple y me quedé atrapado con este estúpido problema.
acme

@acme: si usa insertar, seguramente duplicará los resultados y si ha marcado su identificación como clave principal, ni siquiera le permitirá insertar filas también.
Sachin Shanbhag

-6

Ejecute esta declaració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 en realidad solo desee actualizar algunos o todos los valores de la columna "dominio". Eso requeriría una declaración UPDATE que realmente hizo algo.


3
Mi respuesta es claramente humorística, y el OP admite un facepalm. No me avergüenzo ni un poquito de eso.
Mike Sherrill 'Cat Recall'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.