2012-04-14 13 views
1

Ich habe ein System, das eine Ajax-Postanforderung enthält, die eine Zeile in eine Tabelle einfügt. Es scheint, dass manchmal der Ajax-Aufruf zweimal aufgerufen wird, was bedeutet, dass dieselben Daten zweimal in zwei benachbarten Zeilen eingefügt werden.MYSQL vermeiden, dieselbe Zeile zweimal einzufügen

Ich plane, zuerst eine Abfrage hinzuzufügen, um eine Zeile mit den gleichen Daten zu versuchen und auszuwählen, und wenn die Anzahl der Zeilen = 0 ist, füge sie hinzu. Gibt es einen besseren Weg, um zwei Abfragen zu vermeiden?

+0

Dies wurde vorher diskutiert worden, siehe http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql – cfedermann

+0

einen alternativen Ansatz Bedenken Sie, dass das eigentliche Problem behebt auf der Seite, die den AJAX-Aufruf zweimal verursacht, anstatt defensive SQL-Abfragen zu schreiben. Ein "IsDirty" -Flag auf der Webseite vielleicht? –

+2

Haben Sie keinen Primärschlüssel oder andere eindeutige Einschränkungen für Ihre Tabellen, um sicherzustellen, dass Sie keine doppelten Daten in Ihrer Datenbank erhalten? Du solltest. Und die ID-Spalte ist nicht ausreichend; Es ist praktisch und automatisch generiert, aber Sie sollten eine andere Kombination von Attributen haben, die einzigartig sind. Dann schlägt der Versuch fehl, die doppelten Daten einzufügen. Es muss eine Möglichkeit geben zu sagen, dass Sie dieselbe Zeile zweimal einfügen. Sonst könnte man die Frage nicht stellen. –

Antwort

3

Sie können die INSERT IGNORE INTO-Syntax oder INSERT ... ON DUPLICATE KEY UPDATE für Ihre INSERT-Anweisung verwenden.

Wenn Sie INSERT IGNORE verwenden, wird die Zeile nicht tatsächlich eingefügt, wenn es einen doppelten Schlüssel ergibt. Die Anweisung erzeugt jedoch keinen Fehler. Es wird stattdessen eine Warnung generiert.

INSERT IGNORE INTO mytable 
    (primaryKey, field1, field2) 
VALUES 
    ('abc', 1, 2); 
0

Ich würde sagen, der beste Weg, um damit umzugehen, ist die Verwendung eines temporären Tokens in Ihrer Anwendung (die als CSRF-Token verdoppeln kann, die Sie wahrscheinlich sowieso brauchen ..).

Wenn das Token mit der Operation gesendet wird, verfällt das Token, so dass es nicht wiederholt werden kann.

Verwandte Themen