Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [MySQL] Einfügen wenn nicht vorhanden, sonst überschreiben (https://www.delphipraxis.net/70970-%5Bmysql%5D-einfuegen-wenn-nicht-vorhanden-sonst-ueberschreiben.html)

3_of_8 7. Jun 2006 14:01

Datenbank: MySQL • Zugriff über: PHP

[MySQL] Einfügen wenn nicht vorhanden, sonst überschreiben
 
Morgen.

Ich weiß grad ned so recht, wie ich das machen soll.

Ich will eine Zeile in eine Tabelle einfügen wenn sie noch nicht vorhanden ist, ansonsten soll die Zeile überschrieben werden.

Einzeln sähe das so aus:

Wenn nicht vorhanden, dann:

INSERT INTO tabellenname VALUES (NULL, 'wert1', 'wert2')

Wenn vorhanden, dann:

UPDATE tabellenname SET wert1='wert1', wert2='wert2'

Wie kann ich das am einfachsten hinkriegen?

alcaeus 7. Jun 2006 14:03

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Moin,

umgekehrt: Update ausfuehren, mit mysql_affected_rows testen, ob eine Zeile veraendert wurde, wenn nicht dann eben insert machen ;)

Greetz
alcaeus

RavenIV 7. Jun 2006 14:23

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
oder du baust Dir eine StoredProcedure.
Dies setzt allerdings eine sehr neue Version des MySQL vorraus.

shmia 7. Jun 2006 15:15

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Hat MySQL denn nicht die erweiterte Syntax
SQL-Code:
REPLACE INTO tabelle (...) VALUES(...)
http://dev.mysql.com/doc/refman/5.1/en/replace.html

PS: Schade, dass das kein SQL Standard ist, obwohl es ein wirklich sinnvolles Feature ist.

Amargosa 7. Jun 2006 15:40

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Hi

Ich mache immer einen INSERT. Sollte der Fehlschlagen mache ich ein UPDATE. Klappt auch der nicht breche ich ab mit einer Fehlermeldung (lasse mir den letzten Fehler von mysql_errno() geben).

3_of_8 7. Jun 2006 17:26

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Naja, habs jetzt anders gemacht:

Code:
if (mysql_fetch_row(mysql_query("SELECT varid FROM vars WHERE varname=$varname"))) {
  mysql_query("UPDATE usw.");
} else {
  mysql_query("INSERT INTO usw.");
}
Aber ich glaube, ich schreibs um auf Alcaeus' Code.

3_of_8 7. Jun 2006 18:21

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Problem: mysql_affected_rows scheint 0 zurückzugeben, wenn der Wert nicht geändert wird.

Wenn ich also value='0' im UPDATE drinstehen hab, aber value schon 0 ist, wird 0 zurückgegeben und mein Script inserted die Zeile trotzdem.

alcaeus 7. Jun 2006 18:25

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Zitat:

Zitat von 3_of_8
Problem: mysql_affected_rows scheint 0 zurückzugeben, wenn der Wert nicht geändert wird.

Wenn ich also value='0' im UPDATE drinstehen hab, aber value schon 0 ist, wird 0 zurückgegeben und mein Script inserted die Zeile trotzdem.

o.O Wie sieht denn dein Query aus? Ich hatte noch nie einen Fall, wo mySQL sowas gemacht hat, was fuer ne Version hast du am Laufen? :gruebel:

Greetz
alcaeus

3_of_8 7. Jun 2006 18:29

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
MySQL 4.1.14 läuft bei mir.

Amargosa 7. Jun 2006 19:33

Re: [MySQL] Einfügen wenn nicht vorhanden, sonst überschreib
 
Das ist jetzt ein Beispiel wie ich es manchmal mache: Insert -> Update -> Error

Code:
#->Query DB, no result
function mysqlqueryonly($squery, $bReturn = FALSE)
{
  if(!mysql_query($squery))
  {
    if($bReturn == FALSE)
    {
      $sError = "f_mysqlqueryonly - Failed query! - Errorno.:".mysql_errno()." Error:".mysql_error();
      mysql_close();
      error_log($sError, 0);
      die($sError);      
    }
    else
    {
      return FALSE;
    }
  } 
  return TRUE;  
}
#<-Query DB, no result

$squery = "INSERT
    INTO users_game(Games_ID, Region_Code, Date, Users)
    VALUES ($sGameID, 'P', '$sDate', $pvalue)";

  if(!mysqlqueryonly($squery, TRUE))
  {
    $squery = "UPDATE users_game
      SET Users = $pvalue
      WHERE Games_ID = $sGameID AND
        Region_Code = 'P' AND
        Date = '$sDate'";
    mysqlqueryonly($squery);      
  }
[edit=alcaeus]delphi- durch code-Tags ersetzt. Mfg, alcaeus[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz