auto_increment - REPLACE

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • auto_increment - REPLACE

    Ich möchte regelmäßig eine csv Datei in die DB einfügen.

    Problem ist jedoch,
    das die Inhalte der csv Datei nicht von mir kommen.
    Deswegen weiß ich auch nicht,
    welche Daten sich geändert haben und welche nicht.

    Mein DB Aufbau sieht so aus:
    id | feld1 | feld2 | usw.

    Meine Überlegung war es jetzt,
    hinter meinem Feld "id" noch ein Feld "kunde" anzulegen.
    Und in diesem Feld würd die genaue Beschreibung des
    einzufügenen Datensatzes gespeichert.
    Das Feld "kunde" würde dann wie "id" funktionieren.
    Denn würde meine id also
    normal weiterlaufen.

    csv Datei:
    kunde | feld1 | feld2 | usw.

    So wollte ich den Aufbau der DB machen:
    id | kunde | feld1 | feld2 | usw.

    Wenn man denn wieder eine csv Datei mittels REPLACE einfügen möchte,
    dann würd die gesamte Datei ja wieder komplett eingefügt,
    auch wenn es schon vorhanden ist, weil das Feld "kunde" ja nicht
    verglichen wird, sondern nur "id".

    Kann man REPLACE nur auf das Feld "kunde" anwenden, bzw.
    gibt es eine andere Möglichkeit sowas zu lösen?

    Ich hoffe ich konnte mein Gedanken einigermaßen formulieren.
    Zuletzt geändert von martinm79; 14.10.2006, 12:17.
    Gut geraten ist halb gewußt.

  • #2
    ja, das geht.. dafür musst du deinem feld "kunde" einen UNIQUE Index verpassen...

    und natürlich dafür sorgen, dass in der csv schön brav überall eine 0 vorangestellt wird, um den index hochzuzählen....

    das hat allerdings den effekt, dass die ID des alten datensatzes nach replace nicht mehr existiert, sondern eine neue vergeben wird..

    replace macht keine echten ersetzungen, sondern löscht den alten datensatz und fügt dann den neuen ein.

    insofern wird id (auto_increment) immer hochgezählt, egal ob ein update gemacht wird, oder neu angefügt wird..

    greetz, high
    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
    When everything else fails, manipulate the data...
    Beschriftungen / Großformatdruck / Werbemittel

    Kommentar


    • #3
      Mhh, meine Id sollte sich wenn Möglich nicht ändern. Zu jedem Datensatz werden Bilder angelegt, die id_nr.jpg heißen. Also der Bildernamen besteht aus der Id.

      Denn kann ich ja noch ein feld kunden_id erstellen, wo die orginale id des jeweiligen Kunden drinne steht. Wenn ich das Feld auf UNIQUE Index setzte, bleibt meine id dann auch bestehen?

      Beispiel:

      id | kunden_id | kunde | feld1 | feld2 | usw
      Gut geraten ist halb gewußt.

      Kommentar


      • #4
        Nein, deine originale id wird in jedem fall hochgezählt..
        das haben auto_increment felder so an sich.. darum heißen sie auch auto_increment.. da intern kein REPLACE sondern nacheinander ein DELETE alter eintrag und danach ein INSERT neuer eintrag durchgeführt wird, kannst du das hochzählen so nicht vermeiden..

        greetz, high
        Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
        When everything else fails, manipulate the data...
        Beschriftungen / Großformatdruck / Werbemittel

        Kommentar


        • #5
          Hab mir das schon gedacht, das es nicht so leicht ist.



          Danke erstmal. :-)

          Aber da ich die Csv Datei eh einmal durchlaufe und umwandeln muß,
          werd ich denn wohl folgendes machen.

          Angenommen die Csv Datei kommt vom Kunden mit der Kunden Nr. 3

          id | kunden_id | kunde | feld1 | feld2 |

          SELECT id, kunden_id WHERE kunde = '3';

          Und beim durchlaufen der Csv Datei setzte ich denn einfach die ID ein.

          PHP-Code:
          if ($row['kunden_id'] == '$IdVomKunden') { // ...Oder in_array(); oder so...
              // Wenn die id bei mir schon gespeichert ist,
              // dann setze ich meine id ein.
              // Der Datensatz wird aktualisiert.
              
          $id $row['id'];
              
          } else {
              
          // Seine ID steht bei mir nicht in der db
              // Das Feld id leer lassen, damit es eine neue id bekommt
              
          $id '';
          }

          // In die csv
          $id$kunden_id$kunde$feld1$feld2 
          Wenn ich den Datensatz schon habe, bleibt meine id und wenn nicht
          bekommt er eine neue id zugewiesen.
          So denke ich mir das jedenfals.

          Würdet Ihr das auch so machen, oder wie sollte man sonst am besten vorgehen?
          Gut geraten ist halb gewußt.

          Kommentar


          • #6
            um da was konkretes zu sagen, weiß ich zu wenig über das, was passieren soll...

            aber ich kann ja mal einen denkanstoß in den raum werfen...

            UPDATE -> guggen ob 0 oder 1 zeile verändert wurden
            falls 0, INSERT

            greetz, high
            Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
            When everything else fails, manipulate the data...
            Beschriftungen / Großformatdruck / Werbemittel

            Kommentar


            • #7
              Ja stimmt ja.
              Wenn ich jetzt eh alle ID vorher aus der DB holen muß, denn brauch ich auch kein REPLACE mehr.


              Wenn ich die ID oder NULL (je nach dem, ob es den Datensatz schon gibt) in die Csv Datei eintrage, denn kann ich doch auch einfach INSERT nehmen. Oder nicht?
              Müßt ich mal probieren.

              Und zu dem was passieren soll:
              Ich möchte jeden Tag den Datenbestand aktuallisieren.
              Das heißt jeden Tag einmal eine neue Csv Datei einfügen.
              - neue Zeilen sollen eingelesen werden
              - bestehende Zeilen sollen aktualisiert werden (fals sie verändert wurden)
              - alte Zeilen soll entfernt werden

              Gut geraten ist halb gewußt.

              Kommentar


              • #8
                wenn du alte zeilen ersatzlos entfernen willst, musst du sowieso noch ganz anders abfragen... da wirst du dir noch ein wenig den Kopf zerbrechen müssen, wie du das am geschicktesten löst.

                greetz, high
                Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
                When everything else fails, manipulate the data...
                Beschriftungen / Großformatdruck / Werbemittel

                Kommentar


                • #9
                  Original geschrieben von highrise
                  wenn du alte zeilen ersatzlos entfernen willst, musst du sowieso noch ganz anders abfragen... da wirst du dir noch ein wenig den Kopf zerbrechen müssen, wie du das am geschicktesten löst.

                  greetz, high
                  Jup.
                  Ich denke mal, ich werde die Id's vergleichen und
                  einsetzten. (in die Csv Datei)
                  Nach dem ich sie eingesetzt habe, werde ich die id aus dem Array löschen.
                  Wenn ID's nicht aus dem Array gelöscht wurden, heißt das ja,
                  das sie nicht mehr im Datensatz vorhanden sind und die Zeilen werden
                  denn gelöscht.

                  Mein erster Ansatz mit Replace war noch nicht durchdacht.

                  Gut geraten ist halb gewußt.

                  Kommentar

                  Lädt...
                  X