Steffen Malte: MySQL: Bevor Insert -> prüfen ob Schlüsselfelder bereits vorhanden

Hallo!

2 MySQL-Tabellen (Bewegungen,Bestand)
1 Eingabeformular (HTML - PHP)

Es existiert ein Formular mit folgenden Eingabefeldern:
Artikel | Farbe | Anzahl + Submit Button

Hier werden alle Wareneingänge sowie -ausgänge eingetragen.
Die Datensätze werden in die Tabelle "Bewegungen" gespeichert.

Nun möchte ich jede Bewegung die neu hinzukommt mit der
"Bestand"s-Tabelle abgleichen.

Das bedeutet sobald eine neue Bewegung erfolgt muss die
"Bestand"s-Tabelle überprüft werden:
1. ist der Artikel mit der Farbe bereits vorhanden
-> soll eine Addition bzw. Subtraktion erfolgen
2. ist der Artikel mit der Farbe nicht vorhanden
-> soll ein neuer Datensatz in die "Bestand"s-Tabelle aufgenommen
werden.

Das speichern in die "Bewegungen"-Tabelle ist realisiert. Nun
stellt sich mir die Frage wie ich am besten die Datensätze
miteinander vergleichen sollte.

Erster Ansatzpunkt:
select artikel,farbe from bewegungen where artikel = $artikel
and farbe = $farbe;
Als nächstes würde ich die Anzahl der zurückgegebenen Zeilen
prüfen und dementsprechend handeln -> 1 = Update 0 = Insert.
Ist die Vorgehensweiße korrekt oder habe ich etwas vergessen
bzw. könnt Ihr mir einen besseren Weg zeigen?

Gruß
Steffen Malte

  1. Erster Ansatzpunkt:
    select artikel,farbe from bewegungen where artikel = $artikel
    and farbe = $farbe;
    Als nächstes würde ich die Anzahl der zurückgegebenen Zeilen
    prüfen und dementsprechend handeln -> 1 = Update 0 = Insert.
    Ist die Vorgehensweiße korrekt oder habe ich etwas vergessen
    bzw. könnt Ihr mir einen besseren Weg zeigen?

    Wenn du nur die Anzahl brauchst solltest du select count(*) from ... where ... verwenden. Das ergibt dann genau einen einzelnen Wert als Ergebnis und keine ungenutzte beliebig große Menge.

    So wie du schreibst gibt es die Kombination Artikel + Farbe jeweils nur einmal. Dann hast du da sicherlich einen Unique Index über diese beiden Felder eingerichtet. Wenn nicht, solltest du das tun, denn das brauchst mein Lösungsvorschlag.

    1. Abfragen des bisherigen Bestandes
    $anzahl = 0;
    $sql = "select anzahl from bestand where artikel=$artikel and farbe=$farbe";
    $result = mysql_query($sql, $connection);
    while ($row = mysql_fetch_array($result))
      $anzahl = $row['anzahl'];

    Damit hast du in $anzahl entweder 0 oder die Anzahl in der aus der DB, wenn vorhanden.

    2. Anzahl +/- Bewegung
    $anzahl += $bewegungsanzahl;

    3. Einfügen mit eventuellem vorherigen Löschen eines bereits bestehenden Eintrages

    REPLACE bestand (artikel,farbe,anzahl) VALUES ($artikel, $farbe, $anzahl);

    Hier kommt der Unique Index zum wirken. Ist ein Datensatz mit $artikel und $farbe bereits vorhanden wird dieser erst gelöscht bevor das Replace den/einen neuen Datensatz einfügt.

    P.s. In meinem Beispiel sind weder die von der DB benötigten 'Maskierungen' noch mysql_real_escape_string() enthalten. Diese musst du bei Bedarf (VARCHAR-Felder) noch einfügen.

    1. Moin,

      Erster Ansatzpunkt:
      select artikel,farbe from bewegungen where artikel = $artikel
      and farbe = $farbe;
      Als nächstes würde ich die Anzahl der zurückgegebenen Zeilen
      prüfen und dementsprechend handeln -> 1 = Update 0 = Insert.
      Ist die Vorgehensweiße korrekt oder habe ich etwas vergessen
      bzw. könnt Ihr mir einen besseren Weg zeigen?

      Wenn du nur die Anzahl brauchst solltest du select count(*) from ... where ... verwenden. Das ergibt dann genau einen einzelnen Wert als Ergebnis und keine ungenutzte beliebig große Menge.

      Hm warum benutzt Du nicht mysql_num_rows ()?

      Viele Grüße TomIRL

      1. Wenn du nur die Anzahl brauchst solltest du select count(*) from ... where ... verwenden. Das ergibt dann genau einen einzelnen Wert als Ergebnis und keine ungenutzte beliebig große Menge.

        Hm warum benutzt Du nicht mysql_num_rows ()?

        Wenn ich die Datensätze nicht brauche, warum soll ich sie dann vom Server bereitstellen lassen?