MYSQL, Problem mit INSERT

null_plan

Mitglied
Hallo Forum,

ich möchte eine Tabelle mit neuen Datensätzen aus einer anderen Tabelle erweitern aber irgendwie bekomme ich das nicht auf die Reihe.

Folgendes hab ich mir zusammen gebastelt:

INSERT INTO
hersteller
SET
shop_iD = 1,
Hersteller_ID = NULL,
ADDR_ID = -1,
HERSTELLER_NAME =
SELECT
update.hersteller_name
FROM
update
LEFT JOIN
hersteller
ON
update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
WHERE hersteller.HERSTELLER_ID IS NULL,
HERSTELLER_IMAGE = NULL,
LAST_CHANGE = NOW(),
SHOP_DATE_ADDED = NULL,
SHOP_DATE_CHANGE = NULL,
CHANGE_FLAG = 'Y',
DEL_FLAG = 'N';

Leider funktioniert das so nicht, ich hoffe mir kann jemand einen Tip geben wie ich die Sache richtig angehe.
 
Es gibt zwar eine INSERT ... SET Syntax, aber ich glaube nicht in Kombination mit SELECT. Dort lautet die Syntax etwas anders.
Versuch mal folgendes

SQL:
INSERT INTO hersteller
(shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME)
SELECT
1, NULL, -1 `update`.hersteller_name
FROM `update`
LEFT JOIN hersteller ON
`update`.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
WHERE hersteller.HERSTELLER_ID IS NULL,
HERSTELLER_IMAGE = NULL,
LAST_CHANGE = NOW(),
SHOP_DATE_ADDED = NULL,
SHOP_DATE_CHANGE = NULL,
CHANGE_FLAG = 'Y',
DEL_FLAG = 'N';

Eine Fehlermeldung wäre übrigens interessant gewesen.
Und wer kam auf die Idee die Tabelle "update" zu nennen? Eventuell muss das in backticks gefasst werden: `update`

EDIT: Folgende WHERE Bedingung wird wohl nie eintreffen: LAST_CHANGE = NOW()
 
Zuletzt bearbeitet:
@CPoly
Ich habe deinen Code mal lauffähig gemacht:

Code:
 INSERT INTO
 	hersteller 
                       (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME, HERSTELLER_IMAGE, LAST_CHANGE, SHOP_DATE_ADDED, 
                         SHOP_DATE_CHANGE, CHANGE_FLAG, DEL_FLAG)  
SELECT
	1, NULL, -1, 
	
		(SELECT 
			t_update.hersteller_name 
		FROM 
			t_update 
		LEFT JOIN 
			hersteller 
		ON 
			t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
			WHERE hersteller.HERSTELLER_ID IS NULL),
	NULL, NOW(), NULL, NULL, 'Y', 'N';

Jetzt hängt er mir zwar einen Datensatz an aber HERSTELLER_NAME bleibt leer.
Hast Du noch eine Idee?
 
Dann liefert die innere Abfrage wohl keinen Wert zurück. Also musst du prüfen, ob
SQL:
SELECT 
			t_update.hersteller_name 
		FROM 
			t_update 
		LEFT JOIN 
			hersteller 
		ON 
			t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
			WHERE hersteller.HERSTELLER_ID IS NULL

Genau eine Zeile liefert. Um auch mehrere auf einmal einzutragen, musst du es so schreiben wie ich (nur ein SELECT, dass innere ist unnötig).
 
OK, das mit dem leeren Eintrag war mein Fehler ;)
Wenn ich es so schreibe wie du es vorschlägst erhalte ich einen "Syntax Error near Hersteller_Image...."
Und mein Query bringt die Fehlermeldung daß mehr als eine Zeile eingelesen werden soll.
 
Zuletzt bearbeitet:
Nutz doch bitte die sql-Tags, wegen des syntax highlighting

Wenn ich es so schreibe wie du es vorschlägst erhalte ich einen "Syntax Error near Hersteller_Image...."

Ja, weil die Bedingungen nicht mit Komma, sondern z.B. mit AND verbunden werden müssen. Ich schreib mal dein zuletzt genanntes Query um (Denk daran, es so ab zu ändern, dass auch mindestens eine Zeile als Ergebnis der Abfrage kommt):

SQL:
INSERT INTO hersteller (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME, HERSTELLER_IMAGE, LAST_CHANGE, SHOP_DATE_ADDED, SHOP_DATE_CHANGE, CHANGE_FLAG, DEL_FLAG)
SELECT  1, NULL, -1, t_update.hersteller_name, NULL, NOW(), NULL, NULL, 'Y', 'N' FROM t_update
LEFT JOIN hersteller ON t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
WHERE hersteller.HERSTELLER_ID IS NULL

Sollte jetzt mit beliebig vielen Zeilen funktionieren.
 
Jetzt kapier ich das ganze :)

Eine Frage hab ich jetzt noch, wie kann man verhindern daß ein leerer Datensatz angehängt wird (ich denke da z.B. an meinen Fehler).

Nutz doch bitte die sql-Tags, wegen des syntax highlighting

Großes ? meinerseits, ich hab hier nur Code, HTML und PHP oder was meinst DU?
 

Neue Beiträge

Zurück