Was die richtige / schnellste Weg ist, zu aktualisieren / fügen Sie einen Datensatz in SQL (Firebird / MySql)

StackOverflow https://stackoverflow.com/questions/343562

  •  19-08-2019
  •  | 
  •  

Frage

Ich brauche SQL einen Datensatz in einer Datenbank zu aktualisieren, wenn es vorhanden ist und es ein, wenn es nicht, schaut sich um mehrere Lösungen für diese sein aussieht, aber ich weiß nicht, was sind die richtigen / akzeptierte Wege dies tun.

Ich würde im Idealfall wie es 5 sowohl auf Firebird 2 und MySQL zu arbeiten, wie das Update benötigt gegen beiden Datenbanken zu lief, und es wäre einfacher, wenn die gleiche SQL auf beiden läuft, wenn sie auf mehr Datenbank arbeiten das wäre plus sein.

Schnelligkeit und Zuverlässigkeit auch Faktor in, Zuverlässigkeit über Geschwindigkeit in diesem Fall, aber es wird möglicherweise verwendet wird 1000 von Aufzeichnungen in schnellen Folge zu aktualisieren (über verschiedene Tabellen).

alle subjections?

War es hilfreich?

Lösung

Sie entweder etwas wie folgt verwenden sollte:

BEGIN TRANSACTION
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever')
    UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
ELSE
    INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
COMMIT

Oder diese, aber sie separat senden und alle Fehler aus dem INSERT ignoriert über Primärschlüssel zu verletzen:

INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'

Andere Tipps

In Firebird 2.1 können Sie UPDATE verwenden OR INSERT oder für einfache Fälle MERGE für komplexere Szenarien.

Für MySQL versuchen, den REPLACE Befehl ein: http: // dev .mysql.com / doc / refman / 5.0 / de / replace.html

(Siehe den Kommentar zu dieser Antwort von Milan Babuskov für Äquivalente auf Firebird).

In Firebird vor 2.1 Sie diese schwierige Art und Weise verwenden können:

insert into table (id, a, b, c) values (:id, :a, :b, :c)
when SQLCODE -803 
do
begin
  update table set a = :a, b = :b, c = :c where id = :id;
end;

REPLACE funktioniert genau wie INSERT, mit der Ausnahme, dass, wenn eine alte Zeile in der Tabelle für einen Primärschlüssel oder einen eindeutigen Index den gleichen Wert wie eine neue Zeile hat, die alte Zeile gelöscht wird, bevor die neue Zeile eingefügt wird.

Syntax:

REPLACE [LOW_PRIORITY | VERSPÄTET]     [INTO] tbl_name [(col_name, ...)]

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),...

Während:. Es ist am besten REPLACE zu vermeiden, wenn mit Einschränkungen arbeitet

I INSERT verwendet habe, in MySQL aktualisieren Zeilen mit:
INSERT INTO table () VALUES () ON DUPLICATE KEY UPDATE key
Aber man kann nicht einen automatisch generierten Schlüssel verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top