Announcement

Collapse
No announcement yet.

Index eindeutig trotz Null

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

  • Index eindeutig trotz Null

    Hallo zusammen,

    ich versuche gerade eine Tabbele auf einem SQL-Server 2008 anzulegen bei der es Spalten geben soll mit einem eindeutigen Index, zugleich soll aber auch ein Null-Wert akzeptiert werden.

    Die Hilfe sagt hier http://msdn.microsoft.com/de-de/library/ms181197.aspx folgendes: In Spalten, in denen NULL-Werte zulässig sind, ist bei einem eindeutigen Index ein NULL-Wert zulässig.

    Versuch ich das dann, bekomme ich die Meldung das das nicht geht. Der fehlertext dazu ist hier zu finden: https://www.microsoft.com/products/e...ver&EvtID=1505

    Hier im Forum gab es die Frage früher schon mal, aber die Lösung schein aktuell nicht zu passen.

    Kann mir jemand sagen, ob ich das vergessen kann oder ob es doch eine Lösung gibt.

    Besten Dank
    Dieter

  • #2
    Hier im Forum gab es die Frage früher schon mal, aber die Lösung schein aktuell nicht zu passen.

    Kann mir jemand sagen, ob ich das vergessen kann oder ob es doch eine Lösung gibt.
    Was meinst du damit? Wenn du nicht genau angibst, was du wo gelsesen hast, kann man schwer sagen, ob das passt oder nicht.

    Und in einem eindeutigen Index kann man höchstens angeben, ob ein NULL-Wert einmal oder gar nicht verwendet werden darf. Eine öftere Verwendung ist nicht möglich, da dann die Eindeutigkeit nicht mehr bestimmbar ist. In diesem Fall arbeitet man meist mit einer berechneten Spalte, die normalerweise den Wert der "Normalspalte" hat, aber bei einem NULL-Wert stattdessen einen eindeutigen Pseudowert generiert, damit das funktioniert.

    bye,
    Helmut

    Comment


    • #3
      Hallo Helmut,

      Hier http://entwickler-forum.de/showthread.php?t=46239 ist der Eintrag den ich meinte.

      Hab ich denn die Hilfe falsch verstanden und die Betonung bei
      >>In Spalten, in denen NULL-Werte zulässig sind, ist bei einem eindeutigen Index ein NULL-Wert zulässig.<<
      liegt auf "EIN" Nullwert ist zulässig?

      Pseudowerte kann ich an der Stelle leider nicht generieren da es sich z.B auch um Email-Adressen handelt, diese aber nicht zwingend erforderlich sein sollen.
      (man glaubt nicht, wie oft [email protected] verwendet wird)

      Gruß
      Dieter

      Comment


      • #4
        Einmal darf dann der NULL-Wert in der Tabelle erscheinen, das sagt die Hilfe und so ist es dann auch...
        [HIGHLIGHT="SQL"]BEGIN TRANSACTION;
        CREATE TABLE dbo.Test (ID INT NOT NULL PRIMARY KEY
        ,Test INT NULL UNIQUE)

        INSERT INTO dbo.Test (Id, Test)
        Values (1,NULL), (2,1), (3,2) ,(4,3);
        SELECT * FROM dbo.Test;

        INSERT INTO dbo.Test (Id, Test) Values (5,NULL); -- geht nicht mehr

        ROLLBACK;
        [/HIGHLIGHT]

        Ab SQL-2008 gibt es Filtered Indexe...
        [HIGHLIGHT="SQL"]
        BEGIN TRANSACTION;
        CREATE TABLE dbo.Test (ID INT NOT NULL PRIMARY KEY
        ,Test INT NULL)

        CREATE UNIQUE INDEX UI_TestFiltered on dbo.Test (Test) WHERE Test IS NOT NULL;

        INSERT INTO dbo.Test (Id, Test)
        Values (1,NULL), (2,1), (3,2) ,(4,3), (5, NULL);

        SELECT * FROm dbo.Test
        ROLLBACK;[/HIGHLIGHT]

        Comment


        • #5
          Hallo,
          Originally posted by mogli8888 View Post
          ...Hab ich denn die Hilfe falsch verstanden und die Betonung bei
          >>In Spalten, in denen NULL-Werte zulässig sind, ist bei einem eindeutigen Index ein NULL-Wert zulässig.<<
          liegt auf "EIN" Nullwert ist zulässig?
          Genau! Es ist exakt und nur ein einziger NULL-Wert möglich. Bereits beim Zweiten wäre es ja nicht mehr eindeutig.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Originally posted by ebis View Post

            Ab SQL-2008 gibt es Filtered Indexe...
            Hallo Helmut,

            das klingt doch gut, werde ich morgen gleich testen.

            Melde mich dann wieder.

            Danke
            Dieter

            Comment


            • #7
              Das mit den Pseudowerten hast du vielleicht missverstanden: man legt eine zusätzliche Spalte vom typ "computed column" an, die wird also nicht befüllt sondern quasi "errechnet". Da schreibt man dann als Wert zB. IsNull(emailadresse, '_' +cast(id as varchar) + '_'), daher ist diese Spalte, auch wenn man keine Emailadresse eingibt, niemals Null und man kann daher da den eindeutigen index drauflegen, der damit verhindert, dass eine Emailadresse doppelt vorkommt.

              bye,
              Helmut

              Comment


              • #8
                Hallo Zusammen,

                vielen Dank für eure Hilfe. Ich habe das mit den Filtered Indexe getestet und das hat super funktioniert. Unkompliziert und für jeden verständlich. Super Tipp Ebis



                Gruß
                Dieter

                Comment

                Working...
                X