2011-10-17 49 views
6

Estoy intentando llenar una nueva tabla con registros de otras 2 tablas.MySQL Insertar registros desde varias tablas a la nueva tabla

period_states es

period_states 
    id 
    period_id 
    sla_id 

períodos nueva/vacía - contiene 15 registros

periods 
    id 

SLAs - contiene 84 registros

slas 
    id 

necesito para poblar period_states con cada sla_id existente que tenga cada período de salida_id. Entonces, en última instancia, debería haber 1260 registros en period_states.

¿Alguna idea de cómo automatizar esto? Sería una pesadilla rellenar manualmente ...

¡Gracias de antemano!

+1

¿Está el campo 'id' en la tabla' period_states' establecido como 'auto_increment'? –

Respuesta

4
INSERT INTO period_states 
(period_id, sla_id) 
SELECT periods.id, slas.id 
FROM periods 
CROSS JOIN slas 
+0

No estoy diciendo que mi respuesta sea incorrecta, pero a juzgar por los comentarios, parece que quería aceptar la respuesta de @ spencer7593 –

+2

, su respuesta es correcta. Dado que esta es la respuesta 'seleccionada', agregaré un comentario aquí que en MySQL, es cierto que 'JOIN',' INNER JOIN' y 'CROSS JOIN' son sinónimos. La especificación ANSI SQL define la 'CROSS JOIN' como una unión sin una condición que produce un producto cartesiano. Incluir la palabra clave 'CROSS' en la declaración (incluso cuando no se requiere) sirve como documentación (para eliminar la ambigüedad y hacer que el intento sea más claro), y hace que la declaración sea más portátil para otros RDBMS. – spencer7593

+1

@ spencer7593 gracias por señalar eso. Actualicé la respuesta por el bien de los lectores futuros. También votó su respuesta para completar –

6

Si la columna id de los estados del período se define como AUTO_INCREMENT, entonces esto debería funcionar:

INSERT INTO period_states (period_id, sla_id) 
SELECT p.id AS period_id 
    , s.id AS sla_id 
    FROM periods p 
CROSS 
    JOIN slas s 

Y aquí es un ejemplo de una forma de proporcionar un valor para la columna de la id:

INSERT INTO period_states (id, period_id, sla_id) 
SELECT @myid := @myid + 1 AS id 
    , p.id AS period_id 
    , s.id AS sla_id 
    FROM periods p 
CROSS 
    JOIN slas s 
CROSS 
    JOIN (SELECT @myid := 0) m 
+0

Impresionante, eso fue todo. es la función "cruzada" que no sabía. Sí, la ID de period_states se incrementa automáticamente. ¡Gracias, racimos! –

+0

Me alegro de que funcionó para ti, Katie. – spencer7593

2
insert into period_states select null, periods.id, slas.id from periods, slas 
Cuestiones relacionadas