2009-06-25 2 views
1

Versuchte Übersetzung der obigen Frage von Nicht-Mutter der englischen Sprache:I INSERT in DB ohne Aufzeichnung tun wollen

Dies ist eine Frage über die schnellste Methode zu verwenden, wenn ein Wert in eine Datenbank einfügen, wenn der Wert kann bereits in der Datenbank sein. INSERT wird fehlschlagen, wenn der Wert vorhanden ist und UPDATE schlägt fehl, wenn dies nicht der Fall ist. Welche dieser Möglichkeiten ist am wünschenswertesten?

  • Tun Sie zuerst SELECT und wählen Sie INSERT oder UPDATE.
  • INSERT zuerst und UPDATE verwenden, wenn es einen doppelten Fehler hatte.

Wenn es andere gute Wahlen neben dem oben genannten gibt, unterrichten Sie mich bitte.

Die Umgebung verwendet MySQL 4.1.

+0

ich sehr ja sicher können Sie. – scunliffe

+0

Wie kann ein Datensatz ohne diesen Datensatz eingefügt werden? – freddiefujiwara

+0

Kann ich vor dem Einfügen auswählen? – freddiefujiwara

Antwort

11

tun wollen Wenn Sie dies in einer einzigen Anweisung tun wollen (klingt wie das, was Sie wollen), würde ich empfehlen die INSERT ... ON DUPLICATE KEY UPDATE Syntax wie folgt :

INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom') 
    ON DUPLICATE KEY UPDATE someothervalue = 'hi mom'; 

die anfängliche INSERT Anweisung wird ausgeführt, wenn es keine vorhandenen Datensatz mit dem angegebenen Schlüssel-Wert (entweder Primärschlüssel oder eindeutigen) ist. Wenn ein Datensatz bereits existiert, wird die folgende UPDATE-Anweisung (someothervalue = 3) ausgeführt.

Dies wird in allen Versionen von MySQL unterstützt. Weitere Informationen finden Sie unter MySQL Reference Manual page for INSERT ... ON DUPLICATE KEY UPDATE

0

Update:, bevor ich ein paar mehr downvotes bekommen ... sollte dies die erste Antwort war zu beachten, bevor die Frage bearbeitet und verstanden wurde)

In aller Ehrlichkeit, es klingt wie Sie. Möchten Sie wissen, was zu tun ist, wenn der Datensatz bereits existiert? oder ist neu?

Deshalb, was Sie (in Pseudo-Code)

$count = SELECT COUNT FROM TABLE WHERE CONDITION; 

if($count == 1){ 
    UPDATE... 
} else { 
    INSERT... 
} 
+0

Danke, kann ich die Bestellung nur per SQL realisieren? – freddiefujiwara

-1

Oder Sie können IF EXISTS Syntax verwenden, um zu überprüfen, ob Zeilen vorhanden sind.

+0

Aber um INSERT * oder * UPDATE angemessen, dies würde immer noch mindestens 2 Abfragen und einige Zwischenprüfung der Anzahl der aktualisierten Zeilen. – defines

+0

Vielen Dank für den Vorschlag. Ich bin glücklich, wenn Sie mir einige Beispiele geben – freddiefujiwara

+0

Frage war "Wenn es andere gute Wahlen neben dem oben genannten gibt, unterrichten Sie mich bitte." Ich habe einen Vorschlag gemacht, also "Danke", dass ich ihn abgelehnt habe, wer auch immer das gemacht hat. – Eugene

0

Ich würde eine Testdatenbank und ein Skript erstellen, um die Auswahl zu vergleichen.

Nur raten, ich glaube, die INSERT zuerst und versuchen mit UPDATE versuchen, ist der schnellere Weg im Durchschnitt. Wenn die Daten nicht bereits in der Datenbank vorhanden sind, haben Sie eine andere Abfrage gespeichert. Wenn sich Ihre Daten häufiger in der Datenbank befinden, führen Sie zuerst ein UPDATE durch und versuchen Sie es erneut mit EINFÜGEN, falls dies fehlschlägt.

Ein Fehler kann jedoch dazu führen, dass eine Transaktion abgebrochen wird und ein Rollback erforderlich ist. Wenn das für Sie schlecht ist, müssen Sie zuerst einen SELECT durchführen.

Ich weiß nichts über MySQL, aber ich weiß, dass wo ich arbeite, wir eine gespeicherte Prozedur in unseren PostgreSQL-Datenbanken verwenden, um dies zu tun. Die gespeicherte Prozedur führt ein SELECT und dann ein INSERT oder UPDATE durch.

0

In PHP würde ich zuerst ein UPDATE durchführen und dann mit mysql_affected_rows() überprüfen, ob die Zeile aktualisiert wurde. Wenn nicht, würde ich einen INSERT machen. Beachten Sie, dass die Zeile für mysql_affected_rows() geändert werden muss, um ein Ergebnis größer als 1 zurückzugeben.