2011-10-17 21 views
6

Próbuję wypełnić nową tabelę rekordami z 2 innych tabel.Wstawianie rekordów MySQL z wielu tabel do nowej tabeli

period_states jest nowy/pusty

period_states 
    id 
    period_id 
    sla_id 

okresy - zawiera 15 rekordów

periods 
    id 

SLA - zawiera 84 rekordów

slas 
    id 

muszę wypełnić period_states z każdym istniejącym sla_id konieczności każdy wychodzący okres_id. Tak więc ostatecznie powinno być 1260 rekordów w stanach_pokojowych.

Każdy pomysł, jak zautomatyzować to? Koszmarem byłoby zapełnianie ręcznie ...

Z góry dziękuję !!

+1

Czy pole "id" w tabeli "period_states" ustawione jako "auto_increment"? –

Odpowiedz

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

Nie mówię, że moja odpowiedź jest błędna, ale sądząc po komentarzach, wygląda na to, że chciałeś przyjąć odpowiedź @ spencer7593: –

+2

Twoja odpowiedź jest właściwa. Ponieważ jest to "wybrana" odpowiedź, dodam tutaj komentarz, że w MySQL prawdą jest, że 'JOIN',' INNER JOIN' i 'CROSS JOIN' są synonimami. Specyfikacja SQL ANSI definiuje 'CROSS JOIN' jako połączenie bez warunku, który wytwarza produkt kartezjański. Włączenie słowa kluczowego 'CROSS' w instrukcji (nawet tam, gdzie nie jest to wymagane) służy jako dokumentacja (w celu usunięcia niejasności i wyjaśnienia zamiaru) i sprawia, że ​​instrukcja jest bardziej przenośna dla innych RDBMS. – spencer7593

+1

@ spencer7593 dzięki za wskazanie tego. Zaktualizowałem odpowiedź dla przyszłych czytelników. Również głosowałem na twoją odpowiedź na kompletność –

6

Jeśli kolumna stanów epoki id jest zdefiniowany jako AUTO_INCREMENT, to powinno działać:

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 

A oto przykład jeden sposób, aby dostarczyć wartość dla kolumny 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

Awesome - to było to. to funkcja "krzyżowa", której nie znałem. Tak, identyfikator okresu_stanu jest automatycznie zwiększany. Dziękuję kiści! –

+0

Cieszę się, że pracował dla ciebie Katie. – spencer7593

2
insert into period_states select null, periods.id, slas.id from periods, slas 
Powiązane problemy