Announcement

Collapse
No announcement yet.

Update Increment mit Compoiste Key

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update Increment mit Compoiste Key

    Hallo,

    ich habe eine Tabelle mit zusammengesetzen Schlüssel.

    Wegen einer Änderung bedarf es nun eines Updates in einer der Schlüssel.

    Der Schlüssel setzt sich zusammen aus einer ID und einer Line Number, die DateTime ist auch eindeutig aber nicht im Schlüssel.

    Z.B.
    Code:
    DateTime (dt)               |     ID     | LineNumber (ln)
    2011-06-20 13:27:22.634285      55            0
    2011-06-20 13:27:22.655079      55            1
    2011-06-20 13:27:22.668225      55            2
    2011-06-20 13:53:58.046228      57            0
    ........
    Nun soll in Zukunft die LineNumber mit 1 beginnen, die LineNumber 0 darf nicht mehr vorkommen.
    Das Update soll nun alle LineNumber Werte um einen Wert erhöhen. Also hier die Werte 1,2,3 haben.

    Ich müsste also mit LineNumber von hinten beginnend den Wert um 1 incrementieren. Allerdings weiß ich nicht wie? Wenn ich das Folgende ausführe bekomme ich eine duplicate key exception.

    Code:
    UPDATE
            TABLE
        SET
            ln= ln +1
        WHERE
            dt IN (
                    SELECT
                            dt
                        FROM
                            TABLE
                        ORDER BY
                            id , ln DESC
            );
    Würde mich freuen wenn jemand Rat wüsste.

    Danke

  • #2
    Test unter SQL_Server, allerdings sollte das Verhalten bei DB2 nicht anders sein
    [HIGHLIGHT= SQL]CREATE TABLE Data
    ( ID INT
    , Ln INT
    , CONSTRAINT PK_Data PRIMARY KEY (ID, LN)
    );
    INSERT INTO Data
    SELECT 55 , 0 UNION ALL
    SELECT 55 , 1 UNION ALL
    SELECT 55 , 2 UNION ALL
    SELECT 57 , 0
    ;
    UPDATE Data
    SET Ln = Ln + 1;

    SELECT * FROM DATA;
    --------------------------
    -- ID Ln
    ------------- -----------
    -- 55 1
    -- 55 2
    -- 55 3
    -- 57 1

    DROP Table Data;
    [/HIGHLIGHT]

    Comment


    • #3
      Originally posted by ebis View Post
      Test unter SQL_Server, allerdings sollte das Verhalten bei DB2 nicht anders sein
      [HIGHLIGHT= SQL]CREATE TABLE Data
      ( ID INT
      , Ln INT
      , CONSTRAINT PK_Data PRIMARY KEY (ID, LN)
      );
      INSERT INTO Data
      SELECT 55 , 0 UNION ALL
      SELECT 55 , 1 UNION ALL
      SELECT 55 , 2 UNION ALL
      SELECT 57 , 0
      ;
      UPDATE Data
      SET Ln = Ln + 1;

      SELECT * FROM DATA;
      --------------------------
      -- ID Ln
      ------------- -----------
      -- 55 1
      -- 55 2
      -- 55 3
      -- 57 1

      DROP Table Data;
      [/HIGHLIGHT]
      Hallo und danke für deine Antwort. Allerdings klappt das bei mir nicht so. Mit dem UPDATE wird versucht einen Schlüssel zu aktualisiern der evtl. schon existiert.
      Beispielsweise wird bei ID=55, Ln=0 mit dem Update der zusammengesetzte Schlüsssel ID=55, Ln=1 erzeugt, der zu dem Zeitpunkt schon existiert und bei mir in einer Duplicate Key Exception resultiert. Daher müsste das Update "von hinten" anfangen und mit den höchsten Ln Nummern anfangen und sich nach unten "durcharbeiten". Leider fehlt mir hierfür der passende SQL.

      Comment


      • #4
        Ihr habt gegen die eisere Regel der Datenbankmodellierung verstoßen:
        Keine fachlichen Werte im Primary Key - auch wenn's in der Wikipedia solche Beispiele gibt.

        Das bedeutet für euch: Alle Constraints abschalten, dann die Änderungen durchführen, Constraints wieder einschalten und hoffen, dass nichts falsch gemacht wurde.

        Idealerweise macht ihr sofort eine eigene Pk Spalte mit einem rein technischen Schlüssel.

        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          Originally posted by hispeedsurfer View Post
          Hallo und danke für deine Antwort. Allerdings klappt das bei mir nicht so. Mit dem UPDATE wird versucht einen Schlüssel zu aktualisiern der evtl. schon existiert.
          Beispielsweise wird bei ID=55, Ln=0 mit dem Update der zusammengesetzte Schlüsssel ID=55, Ln=1 erzeugt, der zu dem Zeitpunkt schon existiert und bei mir in einer Duplicate Key Exception resultiert. Daher müsste das Update "von hinten" anfangen und mit den höchsten Ln Nummern anfangen und sich nach unten "durcharbeiten". Leider fehlt mir hierfür der passende SQL.
          Pech, dann verhält sich DB2 anders als SQL-Server, denn der macht das ja, wie im Beispiel zu sehen ist (Primary Key ist auch Unique)

          Comment


          • #6
            Hallo,

            ich habe hier nicht um irgend welche Grundsatzdiskusionen im Datenbankdesign gebeten, sondern wollte einen Vorschlag, wie ich das nunmal bestehende Problem lösen kann.
            Würde mich freuen, wenn jemand eine Idee hat, das mit SQL lösen zu können.

            Comment


            • #7
              Einen Lösungsvorschlag hast Du doch.

              Originally posted by dimitri View Post
              Das bedeutet für euch: Alle Constraints abschalten, dann die Änderungen durchführen, Constraints wieder einschalten und hoffen, dass nichts falsch gemacht wurde.

              Dim
              Zitat Tom Kyte:
              I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

              Comment


              • #8
                Originally posted by dimitri View Post
                Einen Lösungsvorschlag hast Du doch.
                Hi dimitri,

                würde eher nach einer reinen SQL Lösung suchen. Habe nicht die Möglichkeit Constrains zu entfernen. Also so etwas in der Richtung wie in meinem ersten Posting.

                Comment


                • #9
                  Mit Cursor

                  Comment

                  Working...
                  X