Ok Ich habe eine temporäre MySQL-Tabelle mit 135.000 Zeilen, aus dieser temporären Tabelle möchte ich mehrere andere Tabellen auffüllen.Füllen einer Tabelle mit einer großen Menge von Daten aus einer temporären Tabelle - MySQL
Zunächst einmal ist dies die Struktur der temporären Tabelle
CREATE TEMPORARY TABLE TVTEMPTABLE ( PROGTITLE TEXT, SUBTITLE TEXT, EPISODE TEXT, YR YEAR, DIRECTOR TEXT, PERFORMERS TEXT, PREMIERE BOOL, FILM BOOL, RPEAT BOOL, SUBTITLES BOOL, WIDESCREEN BOOL, NEWSERIES BOOL, DEAFSIGNED BOOL, BNW BOOL, STARRATING TINYINT, CERTIFICATE VARCHAR(5), GENRE VARCHAR(50), DESCRIPTION TEXT, CHOICE BOOL, PROGDATE DATE, STARTIME TIME, ENDTIME TIME, DURATION INT, CHANNELID INT NOT NULL)
Und das ist die Struktur von einem der Tische plane ich von diesen zu füllen.
CREATE TABLE PROGRAMME ( PROGRAMMEID INT NOT NULL AUTO_INCREMENT, GENREID INT NOT NULL, PROGTITLE VARCHAR(50), YR YEAR, DIRECTOR VARCHAR(50), PERFORMERS TEXT, FILM BOOL, WIDESCREEN BOOL, BNW BOOL, CERTIFICATE VARCHAR(5), DESCRIPTION TEXT, PRIMARY KEY(PROGRAMMEID), INDEX (GENREID), FOREIGN KEY (GENREID) REFERENCES GENRE(GENREID) ) ENGINE=INNODB;
Und das ist, wie ich meinen Einsatz an die Programmtabelle jedoch tue
INSERT INTO PROGRAMME ( GENREID, PROGTITLE, YR, DIRECTOR, PERFORMERS, FILM, WIDESCREEN, BNW, CERTIFICATE, DESCRIPTION) SELECT G.GENREID, T.PROGTITLE, T.YR, T.DIRECTOR, T.PERFORMERS, T.FILM, T.WIDESCREEN, T.BNW, T.CERTIFICATE, T.DESCRIPTION FROM TVTEMPTABLE T,GENRE G WHERE G.GENRENAME = T.GENRE AND NOT EXISTS ( SELECT * FROM PROGRAMME P WHERE P.PROGTITLE = T.PROGTITLE)
Dies ist eine sehr sehr lange Zeit zu tun, wie soll ich diesen Ansatz?
Danke, Paul
Ok Danke Jungs noch ein paar Probleme mit diesem, die ich die LEFT JOIN Beispiel bin versucht, ich habe jedoch festgestellt, dass, wenn die Tabelle in ich das Einfügen ist leer zu beginnen Allerdings fügt es dann Duplikate ein. Hier ein einfaches Beispiel:
CREATE TEMPORARY TABLE TEMP(
GENRENAME TEXT);
CREATE TABLE GENRE(
GENREID INT NOT NULL AUTO_INCREMENT,
GENRENAME TEXT, PRIMARY KEY(GENREID)
) ENGINE=INNODB;
INSERT INTO TEMP(
GENRENAME)
VALUES("news");
INSERT INTO TEMP(
GENRENAME)
VALUES("news");
Damit wird das Genre "Nachrichten" zweimal in die temporäre Tabelle eingefügt. Jetzt, wenn ich diesen SQL-Befehl
INSERT INTO GENRE(
GENRENAME)
SELECT
T.GENRENAME
FROM
TEMP T
LEFT JOIN
GENRE G ON G.GENRENAME=T.GENRENAME
WHERE
G.GENRENAME IS NULL;
ausführen Es fügt "Nachrichten" zweimal in die Genrentabelle ein, die falsch ist. Wenn ich den gleichen Befehl erneut ausführe, fügt es korrekt keine neuen Zeilen ein.
Genau. Eine korrelierte Unterabfrage ist hier fehlerhaft. Du könntest (ich würde es sowieso) es auch in eine linke Verbindung umschreiben. – Mchl
Ich habe es auch versucht, aber es scheint auch zu laufen für eine lange Zeit, erwarte ich zu viel? – PDStat