Moin, folgendes ist das Problem: Per php möchte ich in MySQL - den Wert eines Feldes ÄNDERN, wenn es bereits existiert, - oder einen entsprechenden Datensatz HINZUFÜGEN, wenn das Feld noch nicht exisitierte. Sprich, auf gut hochdeutsch: Hinterher soll da stehen: Eindeutige ID: 13 Name: Ratti ...egal, ob es die "13" vorher schon gab und welchen Wert "Name" hatte. Mein Problem: Es soll auch dann klappen, wenn beides bereits vorher exakt so vorhanden war! Ich habe sowas im Einsatz, Pseudocode, ungequotet: UPDATE SET name="ratti" WHERE id=13 if mysql_affected_rows == 0 { INSERT SET name="ratti" , id=13 } Das klappt in allen Fällen - AUSSER, wenn der Datensatz vorher schon genau so aussah, denn affected_rows meldet nur die tatsächlich veränderten Datensätze zurück (Bin ich alleine mit der Meinung, daß das total bescheuert ist?). In diesem Fall bekomme ich eine 0 geliefert, der nächste Befehl liefert mir dann einen Fehler, weil die id als UNIQUE deklariert ist - was auch korrekt ist. Da die Datenbank sehr groß ist, kommt es nicht in Frage, vorher mit SELECT die Werte auszugraben und zu gucken, was man tun muß. Da das ganze auch auf älteren Distris laufen soll, kommt ebenfalls nicht in Frage INSERT ... ON DUPLICATE KEY UPDATE zu verwenden, weil das ab MySQL 4.1 und somit zu neu ist. Für REPLACE finde ich leider nicht heraus, seit wann das drin ist - und ehrlich gesagt, ich begreife nicht, was genau es denn nun ersetzt und was nicht. Gruß und Danke, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Am Montag, 29. November 2004 22:03 schrieb Joerg Rossdeutscher
(Joerg Rossdeutscher
UPDATE SET name="ratti" WHERE id=13 if mysql_affected_rows == 0 { INSERT SET name="ratti" , id=13 }
Das klappt in allen Fällen - AUSSER, wenn der Datensatz vorher schon genau so aussah, denn affected_rows meldet nur die tatsächlich veränderten Datensätze zurück (Bin ich alleine mit der Meinung, daß das total bescheuert ist?). In diesem Fall bekomme ich eine 0 geliefert, der nächste Befehl liefert mir dann einen Fehler, weil die id als UNIQUE deklariert ist - was auch korrekt ist.
Habe folgendes für Dich gefunden: (vgl: http://de2.php.net/manual/de/function.mysql-affected-rows.php) "Note: When using UPDATE, MySQL will not update columns where the new value is the same as the old value. This creates the possiblity that mysql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the query." As of PHP 4.3.0 (I assume, I only tried with 4.3.2), you can make mysql_affected_rows() return the number of rows matched, even if none are updated. You do this by setting the CLIENT_FOUND_ROWS flag in mysql_connect(). For some reason, not all the flags are defined in PHP, but you can use the decimal equivalent, which for CLIENT_FOUND_ROWS is 2. So, for example: $db= mysql_connect("localhost", "user", "pass", false, 2); mysql_select_db("mydb", $db); $query= "UPDATE ..."; mysql_query($query); print mysql_affected_rows(); // more than 0 mysql_query($query); // same query twice print mysql_affected_rows(); // still more than 0 Gruß Martin
Joerg Rossdeutscher wrote:
Ich habe sowas im Einsatz, Pseudocode, ungequotet:
UPDATE SET name="ratti" WHERE id=13 if mysql_affected_rows == 0 { INSERT SET name="ratti" , id=13 }
Vielleicht geht es ja erst den INSERT und bei einer Schlüsselverletzung dann den UPDATE zu machen. Bis denne Jürgen Busse -- --------------------------------------------------------------------- Kluge Leute können sich dumm stellen, das Gegenteil ist schwieriger. (Kurt Tucholsky) --------------------------------------------------------------------- IMPORTANT NOTICE: This email is confidential, may be legally privileged, and is for the intended recipient only. Access, disclosure, copying, distribution, or reliance on any of it by anyone else is prohibited and may be a criminal offence. Please delete if obtained in error and email confirmation to the sender. If you use Outlook then please do not put my email address into your address-book so that WHEN you get a virus it won't use my address in the From field. begin LOVE-LETTER-FOR-YOU.TXT.vbs No virus, just text!!!!! Outlook is great! End
Am Montag, 29. November 2004 22:03 schrieb Joerg Rossdeutscher:
Per php möchte ich in MySQL - den Wert eines Feldes ÄNDERN, wenn es bereits existiert, - oder einen entsprechenden Datensatz HINZUFÜGEN, wenn das Feld noch nicht exisitierte.
Sprich, auf gut hochdeutsch: Hinterher soll da stehen:
Eindeutige ID: 13 Name: Ratti
...egal, ob es die "13" vorher schon gab und welchen Wert "Name" hatte. Mein Problem: Es soll auch dann klappen, wenn beides bereits vorher exakt so vorhanden war!
Ich habe sowas im Einsatz, Pseudocode, ungequotet:
UPDATE SET name="ratti" WHERE id=13 if mysql_affected_rows == 0 { INSERT SET name="ratti" , id=13 }
Das klappt in allen Fällen - AUSSER, wenn der Datensatz vorher schon genau so aussah, denn affected_rows meldet nur die tatsächlich veränderten Datensätze zurück (Bin ich alleine mit der Meinung, daß das total bescheuert ist?). In diesem Fall bekomme ich eine 0 geliefert, der nächste Befehl liefert mir dann einen Fehler, weil die id als UNIQUE deklariert ist - was auch korrekt ist.
Da die Datenbank sehr groß ist, kommt es nicht in Frage, vorher mit SELECT die Werte auszugraben und zu gucken, was man tun muß.
Da das ganze auch auf älteren Distris laufen soll, kommt ebenfalls nicht in Frage INSERT ... ON DUPLICATE KEY UPDATE zu verwenden, weil das ab MySQL 4.1 und somit zu neu ist.
Für REPLACE finde ich leider nicht heraus, seit wann das drin ist - und ehrlich gesagt, ich begreife nicht, was genau es denn nun ersetzt und was nicht.
Replace macht eigentlich genau das, was Du willst: <schnipp> REPLACE works exactly like INSERT, except that if an old record in the table has the same value as a new record for a PRIMARY KEY or a UNIQUE index, the old record is deleted before the new record is inserted. <schnapp> Also macht replace ein Insert, außer wenn der PK bereits existiert, dann macht er zuerst ein Delete auf den betreffenden Satz und dann ein Insert. Du kannst aber auch wie folgt vorgehen, wenn das "IGNORE" bereits Bestandteil früherer Versionen ist: UPDATE IGNORE tabelle SET ... WHERE id = 13; INSERT IGNORE INTO tabelle (...) VALUES (...); IGNORE bricht nicht ab, wenn es auf einen Fehler trifft. Jan P.S.: Ich weiss nicht, woher Deine einzufügenden Daten stammen - wenn sie aus einer Datei kommen, solltest Du Dir mal LOAD DATA anschauen - ist deutlich schneller als Inserts oder Updates. -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
participants (4)
-
Dr. Zook
-
Jan.Trippler@t-online.de
-
Joerg Rossdeutscher
-
Martin Knipper