php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.07.2011, 16:03  
Benutzer
 
Registriert seit: 12.04.2011
Beiträge: 43
PHP-Kenntnisse:
Fortgeschritten
Steeno befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Insert update replace

Hallo Leute,

wenn ich es richtig verstehe, ist REPLACE eine Kombination zwischen INSERT und UPDATE. REPLACE sucht nach einem Datensatz mit den gleichen Werten, wenn ein Datensatz gefunden wurde wird UPDATE ausgeführt, wird keiner gefunden, wird INSERT ausgeführt. Wobei bei diesem Update es egal ist, ob die alten Werte mit den neuen identisch sind.

Muss ich auch zwingend einen Index-Schlüssel mit angeben?
Denn bei folgendem Code werden immer neue Datensätze hinzugefügt:
PHP-Code:
mysql_query("REPLACE table (field1,field2,field3,field4) VALUES ('var1','var2','var3','var4')"); 
Hab ich was falsch gemacht oder muss ich noch eine WHERE-Klausel mit einfügen? Bin mir nicht sicher ob das überhaupt mit REPLACE geht.

Danke für euer fundamentales Wissen
Steeno ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.07.2011, 16:09  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Steeno Beitrag anzeigen
Muss ich auch zwingend einen Index-Schlüssel mit angeben?
Überleg mal:
Zitat:
REPLACE sucht nach einem Datensatz mit den gleichen Werten
Wenn sich diese „gleichen Werte“ auf den kompletten Datensatz beziehen würden - dann wäre eine UPDATE-Funktionalität ziemlich sinnfrei, weil alle Felder die gleichen Inhalte bekommen würden, die sie eh schon haben.

http://dev.mysql.com/doc/refman/5.1/en/replace.html:
Zitat:
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 24.07.2011, 16:20  
Benutzer
 
Registriert seit: 12.04.2011
Beiträge: 43
PHP-Kenntnisse:
Fortgeschritten
Steeno befindet sich auf einem aufstrebenden Ast
Standard

Okay, also wenn REPLACE einen identischen Datensatz findet, wird er gelöscht und der neue eingefügt.
Soweit so gut, nur warum fügt er bei mir immer einen neuen Datensatz ein, wenn doch alle neuen Werte den alten Werten entsprechen?
Steeno ist offline   Mit Zitat antworten
Alt 24.07.2011, 16:24  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Auf welchen Spalten hast du denn einen der genannten Index-Typen liegen?
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 24.07.2011, 16:31  
Benutzer
 
Registriert seit: 12.04.2011
Beiträge: 43
PHP-Kenntnisse:
Fortgeschritten
Steeno befindet sich auf einem aufstrebenden Ast
Standard

naja, nach meinem beispiel oben liegt ein Primary Key bei field0, also quasi nicht mit angegeben, würde ich ja bei INSERT auch nicht machen, da autoincrement.

also eigentlich gehts ja darum:

ich führe eine SELECT-Abfrage durch, welche nur 1 Datensatz wiedergeben kann.
mit @mysql_num_rows prüfe ich ob einer gefunden wurde, wenn ja hätte ich anschließend eine UPDATE-Anweisung ausgeführt, wenn nicht, eine INSERT-Anweisung.
anschließend mit mysql_affected_rows überprüft ob alles funktioniert hat, allerdings ist es ja bei UPDATE so, das wenn kein wert verändert wurde, weil ja alles gleich, nichts zurück liefert und so mysql_affected_rows fehlschlägt.

also in etwa so:

PHP-Code:
$q mysql_query("SELECT table_id FROM table WHERE ma_id = '$var1' AND date = '$var2'");

if(@
mysql_num_rows($q) == 1){

    
$d mysql_fetch_array($q);
    
$id $d['table_id'];
    
$u "UPDATE table SET ";
    
$u.= "field2 = '$var2', "
    
$u.= "field3 = '$var3', "
    
$u.= "field4 = '$var4' "
    
$u.= "WHERE table_id = '$id'";
    
mysql_query($u);
    
}else{
    
$i mysql_query("INSERT INTO table (field1, field2, field3, field4, field5) VALUES ('$bla1','$bla2','$bla3','$bla4','$bla5')");
}

if(
mysql_affected_rows() == 1){
    ...
}else{
    ...


auch mit folgender Version wird ein neuer DS erzeugt:
PHP-Code:
mysql_query("INSERT INTO table (field2, field3, field4, field5, field6) VALUES ('$var1','$var2','$var3','$var4','$var5') ON DUPLICATE KEY UPDATE field1 = '$id'"); 
oder muss ich auf allen Feldern einen INDEX legen?

Geändert von Steeno (24.07.2011 um 20:42 Uhr).
Steeno ist offline   Mit Zitat antworten
Alt 25.07.2011, 08:19  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Zitat:
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.
REPLACE funktioniert nur mit einem primary key oder unique-index.

Grüße.
php1704 ist offline   Mit Zitat antworten
Alt 25.07.2011, 12:11  
Benutzer
 
Registriert seit: 12.04.2011
Beiträge: 43
PHP-Kenntnisse:
Fortgeschritten
Steeno befindet sich auf einem aufstrebenden Ast
Standard

also hab ich ja so mit angegeben:
PHP-Code:
ON DUPLICATE KEY UPDATE field1 '$id' 
oder muss ich field 1 auch noch vorne bei INSERT INTO(field1 ... mit angeben?
dann würde aber kein autoincrement gehen oder?
Steeno ist offline   Mit Zitat antworten
Alt 25.07.2011, 12:24  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Steeno Beitrag anzeigen
dann würde aber kein autoincrement gehen oder?
Wenn du autoincrement haben willst, willst du doch ganz offensichtlich keinen bestehenden Datensatz updaten ...?

Vielleicht überlegst du erst mal ein bisschen gründlicher, ob du dir hier überhaupt das richtige Werkzeug für dein Vorhaben ausgesucht hast.

Zitat:
anschließend mit mysql_affected_rows überprüft ob alles funktioniert hat, allerdings ist es ja bei UPDATE so, das wenn kein wert verändert wurde, weil ja alles gleich, nichts zurück liefert und so mysql_affected_rows fehlschlägt.
Ob das UPDATE-Statement „erfolgreich“ war im Sinne von fehlerfrei, kannst du am Rückgabewert von mysql_query ablesen.

Wenn du irgendetwas anderes überprüfen willst - dann definiere bitte erst mal klar und nachvollziehbar, was überhaupt.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 25.07.2011, 16:32  
Benutzer
 
Registriert seit: 12.04.2011
Beiträge: 43
PHP-Kenntnisse:
Fortgeschritten
Steeno befindet sich auf einem aufstrebenden Ast
Standard

dann nochmal anders:

id aus DB auslesen,
mit @mysql_num_rows prüfen ob Datensatz vorhanden,
wenn ja, Datensatz updaten,
wenn nicht, neuen Datensatz generieren.
jetzt prüfen ob update oder insert erfolgreich war z.B. mit:
PHP-Code:
if(mysql_affected_rows() == 1){
    ...
}else{
    ...

allerdings funktioniert das bei update nicht, wenn alle werte gleich sind, weil ja kein Datensatz von einer Veränderung betroffen ist, allerdings weis ich das nicht vorher und kann es so nicht überprüfen.
wie kann ich dennoch testen ob alles richtig funktioniert hat um eine erfolgsmeldung auszugeben?
ich dachte das replace vielleicht ne möglichkeit gewesen wäre.
Steeno ist offline   Mit Zitat antworten
Alt 25.07.2011, 16:48  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Noch mal: Auch ein UPDATE, das keine Spaltenwerte verändert, weil alle Spalten bereits die „neuen“ Werte hatten, ist ein erfolgreiches.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] INSERT ... ON DUPLICATE KEY UPDATE Problem Leberwurstbrot Datenbanken 9 29.05.2011 12:33
[Erledigt] mehrfaches INSERT über PHP drzwockel PHP Tipps 2010 10 10.08.2010 11:03
[Erledigt] insert ... ON DUPLICATE KEY UPDATE Paul.Schramenko Datenbanken 1 26.05.2010 15:25
MySQL: INSERT INTO oder UPDATE verknüpft in einem Query juice122 Datenbanken 21 06.05.2010 20:25
[Erledigt] Update Insert von Tabellen frank1973 Datenbanken 14 11.04.2010 18:49
mysqli_multi_query lässt Eintrag aus... Samhayne Datenbanken 8 07.02.2010 19:02
[Erledigt] INSERT und UPDATE gleichzeitig? estebu Datenbanken 8 05.10.2009 00:35
Insert ... On duplicate key update Jacke Datenbanken 2 08.04.2009 14:11
INSERT.. ON DUPLICATE KEY UPDATE cycap Datenbanken 3 26.10.2007 13:08
Pathfinding Algorithmus optimieren? (Algorith. von Dijkstra) Martin13 PHP Tipps 2007 19 04.09.2007 19:20
INSERT.. on duplicate key UPDATE... - sinnvoll? mrSpok Datenbanken 3 28.11.2006 10:14
Differenz zwischen 2 Zahlen duderino PHP Tipps 2006 19 10.08.2006 22:12
PRoblem mit Cookie bei PHPbb-Board PHP Tipps 2007 8 12.12.2005 20:56
[Erledigt] fehler den ich noch nie gesehen habe Datenbanken 7 09.06.2005 14:29
HILFE: Column count doesn't match value count at row 1 Datenbanken 17 12.06.2004 16:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
insert und update kombinieren, sql replace, update replace, php sql replace, sql insert replace php code, transact sql replace kombinieren, php update insert erzeugen, sql update insert kombination, insert datensatz update where, sql update replace, sql replace in verschiedenen datensätzen, mysql_affected_rows() liefert immer nur 1, php update replace unterschied, update or replace sql, sql replace geht nicht, sql insert updaten kombinieren, sql insert replace wenn, unterschied oder replace sql, sqlite update insert replace, insert replace php

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum