[MySQL] insert nur, wenn Eintrag nicht existiert

12/10/2014 20:11 Menan#16
Ausserhalb von Funktionen kann man die IF Anweisung soweit ich weiß nicht verwenden in MySQL.
12/10/2014 20:18 Mr.Tr33#17
und wie würde es dann aussehen wenn ich den Query in PHP ausführen will?
12/10/2014 23:21 Warnuk3r#18
[Only registered and activated users can see links. Click Here To Register...]
12/11/2014 13:25 Mr.Tr33#19
Joa ... ich vermute es ist immer noch der selbe Fehler
Code:
mysql> IF EXISTS(SELECT `type` FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEGIN
		UPDATE `words`
		SET `type` = Value(`type`), `update` = Value(`update`)
		WHERE `wort`= Value(`wort`)
	END
ELSE
	BEGIN
		INSERT INTO `words` (`wort`, `type`, `update`)
		VALUES ('ich', 'Pronomen', '1418036206')
	END
END IF;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT `type` FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEGIN
' at line 1
12/12/2014 00:34 Warnuk3r#20
Quote:
Originally Posted by Menan View Post
Ausserhalb von Funktionen kann man die IF Anweisung soweit ich weiß nicht verwenden in MySQL.
Quote:
Originally Posted by Warnuk3r View Post
[Only registered and activated users can see links. Click Here To Register...]
Quote:
Originally Posted by Mr.Tr33 View Post
Joa ... ich vermute es ist immer noch der selbe Fehler
Code:
mysql> IF EXISTS(SELECT `type` FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEGIN
		UPDATE `words`
		SET `type` = Value(`type`), `update` = Value(`update`)
		WHERE `wort`= Value(`wort`)
	END
ELSE
	BEGIN
		INSERT INTO `words` (`wort`, `type`, `update`)
		VALUES ('ich', 'Pronomen', '1418036206')
	END
END IF;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT `type` FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEGIN
' at line 1
Deine erste Zeile ist immer noch falsch.
12/12/2014 10:42 Mr.Tr33#21
Quote:
Originally Posted by Warnuk3r View Post
Deine erste Zeile ist immer noch falsch.
Ja und wie wäre es denn dann richtig?
Nach den "Vorlangen" im Link gehts ja auch nicht, wie oben beschrieben.
Wenn ich es nicht selbst herausfinden würde, dann würde ich nicht wohl nach Hilfe fragen.
12/12/2014 16:56 Shawak#22
versuch mal
Code:
IF (SELECT `type` NOT NULL FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEGIN
		UPDATE `words`
		SET `type` = Value(`type`), `update` = Value(`update`)
		WHERE `wort`= Value(`wort`)
	END
ELSE
	BEGIN
		INSERT INTO `words` (`wort`, `type`, `update`)
		VALUES ('ich', 'Pronomen', '1418036206')
	END
END IF;
12/12/2014 20:56 Mr.Tr33#23
Code:
mysql> IF (SELECT `type` NOT NULL FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEGIN
		UPDATE `words`
		SET `type` = Value(`type`), `update` = Value(`update`)
		WHERE `wort`= Value(`wort`)
	END
ELSE
	BEGIN
		INSERT INTO `words` (`wort`, `type`, `update`)
		VALUES ('ich', 'Pronomen', '1418036206')
	END
END IF;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT `type` NOT NULL FROM `words`  WHERE `wort`= Value(`wort`)) THEN
	BEG' at line 1
12/14/2014 01:28 Mashkin#24
Quote:
Originally Posted by Shawak View Post
Code:
SELECT `type` NOT NULL FROM ...
Was ist das denn?

Wie auf StackOverflow beschrieben lässt sich der IF-Block nicht außerhalb von Funktionen verwenden.

Ich würde empfehlen entweder die wort-Spalte als UNIQUE zu definieren (genauer: zu einem UNIQUE-Index hinzuzufügen), oder tatsächlich mehrere Queries zu verwenden.

Ersteres würde auch helfen, die Integrität der Daten sicherzustellen, da dann unter keinen Umständen ein wort-Wert doppelt eingefügt werden kann.

Code:
ALTER TABLE `words` ADD UNIQUE `wort_index`(`wort`);
12/14/2014 12:06 Mr.Tr33#25
Man kann aber ein UNIQUE nicht auf ein text Type setzen. Und meine wort Spalte ist ein text Type.
12/14/2014 19:00 Mashkin#26
Quote:
Originally Posted by Mr.Tr33 View Post
Man kann aber ein UNIQUE nicht auf ein text Type setzen. Und meine wort Spalte ist ein text Type.
Wenn es sich bei den Werten für wort um prinzipiell eher kurze Daten handelt (z.B. ein einzelnes Wort), wäre der VARCHAR-Typ evtl. vorzuziehen.
Dieser wird üblicherweise (anders als TEXT und BLOB) "inline" mit der Zeile gespeichert (TEXT und BLOB verwenden Pointer auf extra gespeicherte Werte). Wenn die Performance oder Größe deiner Tabelle nicht durch sehr lange Text-Werte leiden, wäre VARCHAR die bessere Wahl.

Besonders wenn deine Anwendung auch die wort-Spalte zum Selektieren verwendet, wäre ein inline-Typ mit der Möglichkeit zur Indizierung einem nicht indizierbaren, extern gespeicherten Typ vorzuziehen.
12/15/2014 22:01 Mr.Tr33#27
Öhm, weiß jetzt nicht wie weit mir das jetzt wirklich bei meinem Problem hilft, aber ich habe es jetzt einfach mal umgesetzt.

[Only registered and activated users can see links. Click Here To Register...]

Diese Meldung kommt nur, wenn ich ein Key Length angebe und dies kann ich nur angeben, wenn ich einen Primary Key setze.
12/15/2014 23:09 damona#28
Setz mal die length von dem varchar auf 255 und teste es nochmal.
12/15/2014 23:18 Mr.Tr33#29
selbes Problem :/