Announcement

Collapse
No announcement yet.

PRIMARY KEY-Einschränkung

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

  • PRIMARY KEY-Einschränkung

    Hi Leute, ist es möglich zu vermdeiden dass mehrere gleiche zahlen vergeben werden können? Für eine Sortierreihenfolge zb.

    Wenn ich meine Spalte Reihenfolge als Primärsschlüssel setze und das Feld updaten will krige ich ne Fehlermeldung:

    Verletzung der PRIMARY KEY-Einschränkung 'PK_SkillGroups'. Ein doppelter Schlüssel kann in das 'dbo.SkillGroups'-Objekt nicht eingefügt werden.
    Die Anweisung wurde beendet.

  • #2
    Wann kriegst du die Fehlermeldung? Wenn du den PK definieren willst oder wenn du dann mal einen Datensatz einfügst, der dagegen verstösst? Wenn es im zweiten Fall passiert, dann wolltest du das doch so, oder? Und wenn es im ersten Fall passiert, dann bestehen schon mehrfache gleiche Zahlen in der Tabelle und der PK kann daher nicht angelegt werden und die Daten müssen daher vorher bereinigt werden.

    bye,
    Helmut

    Comment


    • #3
      Das passiert zb beim löschen wenn ich eine row löschen möchte, da räume ich vorher auf und zwar ziehe ich alle Reihen - 1 da einer wegfällt.




      Wenn ich lösche setze ich in der Spalte Active eine 0 für den row der gelöscht somit wird er nicht angezeigt behält dennoch seinen alten ReihenfolgenID(rank_order)

      Beim löschen:

      1. ziehe ich wieder 1 ab
      Code:
      UPDATE SkillGroups SET rank_order = rank_order - 1 Where rank_order >=4and active = 1
      und setze hier 0 in Feld Active
      //zum deaktiviren bzw löschen
      Code:
      UPDATE SkillGroups SET active = 0 WHERE SkillGroupID=44
      Aber ich will keine doppelte Einträge in der Db haben.
      Attached Files
      Zuletzt editiert von Gervacio; 16.02.2010, 21:03.

      Comment


      • #4
        Sollte das Beipiel zusammenpassen? Wenn du ein
        UPDATE SkillGroups SET rank_order = rank_order - 1 Where rank_order >=4and active = 1
        durchführst, solltest du dann ein
        UPDATE SkillGroups SET active = 0 WHERE SkillGroupID=37
        haben, da ja das der Eintrag mit rank_order 3 ist und wenn du alle ab 4 um eines kleiner machst, wird aus 4 eine 3 und aus 5 eine 4 usw.
        Dabei hast du dann noch das Problem, dass du
        a) bevor du 4 auf 3 änderst, den Datensatz mit rank_order 3 löschen musst und
        b) du die Update-Reihenfolge angeben musst, da es sonst passieren kann, dass das Update nicht mit der kleinsten Zahl beginnt sondern vielleicht zB. als erstes die 7 auf eine 6 ändert, die dann doppelt wäre. Wie man das löst siehe hier

        bye,
        Helmut

        Comment


        • #5
          Hi danke erstmal für den Hinweis.

          Das Problem was bei mir besteht ist dass die gelöschten Rows nicht wirklich gelöscht werden sondern nur deaktiviert. Aber welch reihenfolgenummer sollensie erhalten wenn die deaktiviert sind?

          Aber zu deinem hinweis

          Also wenn ich das richtig verstehe, holt er sich erstmal die Spalte und sortiert sie "desc"

          Code:
          WITH InvoicesNumbered AS
          (
          
          SELECT *, ROW_NUMBER() OVER(ORDER BY LastModifiedTimestamp desc) AS RowNum
          
          FROM Invoice
          
          )

          Dann aktualisiert er eben alle diese Spalten
          Code:
          UPDATE InvoicesNumbered
          
          set createdby =
          
          (select top 1 userID from [user] where clientid = InvoicesNumbered .invoiceclientid)
          
          WHERE RowNum < 20000;
          Ich habe es nun für meinen gebrauch so umgebuat

          Code:
          WITH rank_order AS (SELECT     *, ROW_NUMBER() OVER (PARTITION BY SkillGroupID ORDER BY rank_order DESC) AS RowNum
          FROM         SkillGroups)
              UPDATE    Skillgroups
               SET              rank_order = (rank_order + 1)
               FROM         [SkillGroups]
               WHERE     (rank_order >= 1 ) AND (active = 1)
          Es führt das auch richtig aus und ignoriert die felder die deaktiviert sind dennoch kommt die Meldung:

          The OVER SQL construct or statement is not supported.

          Comment


          • #6
            a) wenn du einen PK auf die Spalte rank_order legst, dann muss die immer eindeutig sein, egal welcher Wert in der Spalte active steht. Das mit "ist deaktiviert" gilt dabei nicht.
            b) warum setzt du die rank_order im Falle des deaktivierens zB. nicht einfach auf einen noch nicht vorhandenen negativen Wert?
            c) du kannst den PK auch aus den beiden Spalten zusammensetzen
            d) ganz schlechte Sache, eine Hilfstabelle genauso zu benennen wie eine Spalte in der Tabelle (rank_order)

            Probiere das mal ein bisschen durch, vielleicht kommst du damit schon zu einer Lösung.

            bye,
            Helmut

            Comment


            • #7
              Hey helmut, den Befehl hier verstehe ich nicht ganz:

              Code:
              WITH rank_order AS (SELECT     *, ROW_NUMBER() OVER (PARTITION BY SkillGroupID ORDER BY rank_order DESC) AS RowNum

              Comment


              • #8
                Ich habe es mal mit ein paar Testdaten und deiner Struktur ausprobiert, aber in diesem Fall braucht man das mit dem row_number usw. wohl nicht. Ich konnte mit

                UPDATE SkillGroups SET rank_order = rank_order + 1 ...

                nie einen Fehler erzeugen. Also vergiss das mal und mache ohne dem weiter.

                bye,
                Helmut

                Comment

                Working...
                X