it-swarm.com.de

MySQL-Tabelle einfügen, wenn nicht vorhanden, andernfalls aktualisieren

UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

Es funktioniert, wenn das datenum vorhanden ist, aber ich möchte diese Daten als neue Zeile einfügen, wenn das datenum nicht vorhanden ist.

AKTUALISIEREN

das Datum ist eindeutig, aber das ist nicht der Primärschlüssel

91
OHLÁLÁ

Jai ist richtig, dass Sie INSERT ... ON DUPLICATE KEY UPDATE Verwenden sollten.

Beachten Sie, dass Sie kein Datum in die Update-Klausel aufnehmen müssen, da es sich um den eindeutigen Schlüssel handelt, der sich also nicht ändern sollte. Sie müssen alle anderen Spalten aus Ihrer Tabelle einschließen. Mit der Funktion VALUES() können Sie sicherstellen, dass beim Aktualisieren der anderen Spalten die richtigen Werte verwendet werden.

Hier ist Ihr Update, das mit der richtigen INSERT ... ON DUPLICATE KEY UPDATE - Syntax für MySQL neu geschrieben wurde:

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)
128
Ike Walker

Versuchen Sie es mit this :

Wenn Sie ON DUPLICATE KEY UPDATE Angeben und eine Zeile eingefügt wird, die einen doppelten Wert in einem UNIQUE index or - PRIMÄRSCHLÜSSEL , MySQL performs an [ - UPDATE ( http: // dev .mysql.com/doc/refman/5.7/de/update.html ) der alten Zeile ...

Die ON DUPLICATE KEY UPDATE - Klausel kann mehrere durch Kommas getrennte Spaltenzuweisungen enthalten.

Mit ON DUPLICATE KEY UPDATE Ist der Wert für die betroffenen Zeilen pro Zeile 1, wenn die Zeile als neue Zeile eingefügt wird, 2, wenn eine vorhandene Zeile aktualisiert wird, und 0, wenn für eine vorhandene Zeile die aktuellen Werte festgelegt werden. Wenn Sie das Flag CLIENT_FOUND_ROWS Für mysql_real_connect() angeben, wenn Sie eine Verbindung zu mysqld herstellen, Der Wert für die betroffenen Zeilen ist 1 (nicht 0), wenn für eine vorhandene Zeile die aktuellen Werte festgelegt wurden.

14
Jai

Ich hatte eine Situation, in der ich eine Tabelle gemäß zwei Feldern (beiden Fremdschlüsseln) aktualisieren oder einfügen musste, für die ich keine EINZIGARTIGE Einschränkung festlegen konnte (daher funktioniert INSERT ... ON DUPLICATE KEY UPDATE nicht). Folgendes habe ich letztendlich verwendet:

replace into last_recogs (id, hasher_id, hash_id, last_recog) 
  select l.* from 
    (select id, hasher_id, hash_id, [new_value] from last_recogs 
     where hasher_id in (select id from hashers where name=[hasher_name])
     and hash_id in (select id from hashes where name=[hash_name]) 
     union 
     select 0, m.id, h.id, [new_value] 
     from hashers m cross join hashes h 
     where m.name=[hasher_name] 
     and h.name=[hash_name]) l 
  limit 1;

Dieses Beispiel stammt aus einer meiner Datenbanken, wobei die Eingabeparameter (zwei Namen und eine Nummer) durch [hasher_name], [hash_name] und [new_value] ersetzt wurden. Das verschachtelte SELECT ... LIMIT 1 ruft den ersten entweder des vorhandenen Datensatzes oder eines neuen Datensatzes ab (last_recogs.id ist ein Autoincrement-Primärschlüssel) und verwendet diesen als den in REPLACE INTO eingegebenen Wert.

1
salfter