[MySQL] insert nur, wenn Eintrag nicht existiert

11/13/2014 23:31 Mr.Tr33#1
Moin,

ich suche eine recht schnelle und simple Methode um Einträge in MySQL nur dann hinzuzufügen, wenn sie bereits nicht existieren (nach einer ID identifizierbar), sonst wird der Eintrag aktuallisiert.

Natürlich könnte ich das mit PHP ganz einfach über 3 Befehle lösen ... aber bei mehreren hunderten Einträgen wäre das nicht gerade aus schnell.

Kennt da jemand eine schnelle Möglichkeit zu?

MfG
Mr.Tr33
11/13/2014 23:50 Mikesch01#2
Was willst du denn genauer aktualisieren? Wenn das eine einmalige Sache ist, dann sollte das mit der Ladezeit nicht schlimm sein.

Gruß
11/13/2014 23:54 Mr.Tr33#3
Das ist eig. ein Cronjob von mir der alle 5 Minuten aufgerufen wird und Einträge überprüft ob diese immer noch identisch sind oder ob halt neue dazu gekommen sind. Deswegen sollte es auch recht schnell funktioniert :D
11/13/2014 23:55 Syc#4
[Only registered and activated users can see links. Click Here To Register...]
11/14/2014 00:08 Mr.Tr33#5
Quote:
Originally Posted by Sycophantic View Post
[Only registered and activated users can see links. Click Here To Register...]
Ich finde es jetzt sehr peinlich meinerseits :D
Ich bin schon so oft auf diesen Link gestoßen, doch irgend wie habe ich das "ON DUPLICATE KEY UPDATE" jedes mal überlesen oder nicht wahr genommen :D

Danke, funktioniert jetzt alles so wie es sollte. Ich hoffe die Geschwindingkeit ist auch ausreichend (habe es noch nicht ganz getestet) :)
12/08/2014 16:48 Mr.Tr33#6
So nochmal auf das Thema zurück zu greifen.

Ich habe eine Tabelle mit den Spalten id, name, type und id hat einen Primary Key und Autoincrese (oder so).
Jetzt möchte ich etwas in die Tabelle eintragen aber nur, wenn der "name" bereits nicht existiert und wenn er es doch tut dann soll "type" aktuallisiert werden.

Wie bekomme ich das hin in nur einem SQL Query?
12/08/2014 17:34 Menan#7
Code:
INSERT INTO table (name, id, type) VALUES("Name", id, Type) ON DUPLICATE KEY UPDATE type=VALUES(type)
12/08/2014 17:41 Mr.Tr33#8
Dann erstellt er bei mir einen neuen Eintrag ... was ich nicht möchte.
12/08/2014 17:43 Menan#9
Quote:
Originally Posted by Mr.Tr33 View Post
Dann erstellt er bei mir einen neuen Eintrag ... was ich nicht möchte.
Brauchst du das in einem Query? Oder gehts auch in 2?

Du müsstest der Spalte Name eben einen UNIQUE Key geben.

Oder per:

Code:
IF EXISTS(SELECT type WHERE name=Value(name) FROM tabelle )
then
  UPDATE tabelle
  SET type = Value(type) 
  WHERE name=Value(Name)
ELSE 
  INSERT INTO tabelle (id, name, type)
  VALUES (id, name, type);
12/08/2014 18:18 Mr.Tr33#10
Möchte es in einem Query :)

Und wie gebe ich einer text Spalte einen UNIQUE Key?
12/08/2014 22:45 Mikesch01#11
Hi,

das ist eigentlich eine Sache von PHP und Co. die serverseitig geprüft werden und dementsprechend reagieren soll.

Hierzu sollten 2 SQL Statements, je 1 nach Verzweigung, benutzt werden.

Gruß
12/09/2014 18:51 Shawak#12
Code:
CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;
Lässt sich ansonsten auch via phpmyadmin o.Ä. im Nachhinein konfigurieren.
12/10/2014 18:46 Mr.Tr33#13
Hmm, ich finde jetzt nicht den Fehler. Woran könnte es liegen?

Code:
mysql> IF EXISTS(SELECT `type` WHERE `wort`= Value(`wort`) FROM `words`)
THEN
  UPDATE `words`
  SET `type` = Value(`type`), `update` = Value(`update`)
  WHERE `wort`= Value(`wort`)
ELSE 
  INSERT INTO `words` (`wort`, `type`, `update`)
  VALUES ('ich', 'Pronomen', '1418036206');
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` WHERE `wort`= Value(`wort`) FROM `words`)
THEN
  UPDAT' at line 1
12/10/2014 19:01 Mikesch01#14
Die Reihenfolge der SQL-Angabe im SELECT-Befehl ist falsch.

Erst kommt SELECT .. dann FROM ... und dann erst WHERE ...
12/10/2014 19:03 Mr.Tr33#15
Joa das dachte ich am Anfang auch aber anscheinend ist es nicht der Fehler :/
Code:
mysql> IF EXISTS(SELECT `type` FROM `words`  WHERE `wort`= Value(`wort`))
THEN
  UPDATE `words`
  SET `type` = Value(`type`), `update` = Value(`update`)
  WHERE `wort`= Value(`wort`)
ELSE 
  INSERT INTO `words` (`wort`, `type`, `update`)
  VALUES ('ich', 'Pronomen', '1418036206');
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
  UPDA' at line 1