none
eindeutige Werte in einer Spalte erzwingen RRS feed

  • Frage

  • Hallo,

    beim Anlegen einer Tabellenspalte habe ich die Möglichkeit über die Identitätsspezifikation einen Index anzulegen, der mit von mir wählbarem Startwert und Schrittweite dann vom Server selbst erstellt wird.

    Nun würde ich gerne die Eigenschaft für die Spalte so festlegen, dass ich den Wert selbst eingeben kann, aber trotzdem jeder Wer einmalig ist und ein doppelter Wert verhindert wird.

    In Access gibt es dazu die Eigenschaft "Indiziert" und als Wert wähle ich "Ja, ohne Duplikate". Wie würde ich das in SQL 2008 machen?

    Vielen Dank, Thomas Schreiber-Ringel

    Mittwoch, 23. Januar 2013 18:43

Antworten

  • hallo Thomas,

    wenn Du die Werte selber festlegen moechtest/musst und dabei sicherstellen musst, dass die Werte eindeutig sind so gibt es mehrere Moeglichkeiten in SQL Server.

    z.b. eine Spalte definiert als Primary Key ist per Definition eindeutig

    oder Du erstelt einen unique Index fuer die Spalte welche beim Einfuegen dann ueberprueft, dass der Wert nicht bereits existiert.

    Die evt. nahe liegendeste Loesung  des Clustered Index funktioniert nicht einfach so, da ein Clustered Index nicht per Definition eindeutig sein muss. Haeufig ist dies jedoch der Fall, dass der Clustered Index gerade auch als Primary Key definiert ist, dies ist aber nicht zwingend. Falls Du den Clustered Index nicht als Primary Key definiert moechtest/kannst, so kannst Du den Clustered Index als unique definieren und SQL Server stellt die Eindeutigkeit der Werte sicher.

    siehe die Beschreibung zu Create Index hier: http://msdn.microsoft.com/en-us/library/ms188783.aspx

    Beispiel C Createing a unique nonclustered index

    USE AdventureWorks2012;
    GO
    IF EXISTS (SELECT name from sys.indexes
                 WHERE name = N'AK_UnitMeasure_Name')
        DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;
    GO
    CREATE UNIQUE INDEX AK_UnitMeasure_Name 
        ON Production.UnitMeasure(Name);
    GO


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.


    • Bearbeitet Daniel_Steiner Mittwoch, 23. Januar 2013 18:54
    • Als Antwort markiert shewanja Mittwoch, 23. Januar 2013 19:54
    Mittwoch, 23. Januar 2013 18:51
  • Wenn ich die Dokumenation richtig verstehe, kann ich nur bei einen Schlüssel pro Tabelle die Eigenschaft CLUSTERED auf ja setzen, damit bleibt mir nur noch ein unique Index.

    korrekt, es kann nur hoechstens einen CLUSTERED INDEX pro Tabelle geben.

    Warum fandest du den Clustered Index "evtl. naheliegender"?

    damit wollte ich ausdruecken, dass viele Personen Clustered Index und Primary Key fuer das selbe halten und daher denken, dass der CLUSTERED INDEX automatisch eindeutig ist.

    In Deinem Beispiel kommst Du wohl um einen unique index (non clustered) nicht herum.


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    • Als Antwort markiert shewanja Mittwoch, 23. Januar 2013 19:54
    Mittwoch, 23. Januar 2013 19:32

Alle Antworten

  • hallo Thomas,

    wenn Du die Werte selber festlegen moechtest/musst und dabei sicherstellen musst, dass die Werte eindeutig sind so gibt es mehrere Moeglichkeiten in SQL Server.

    z.b. eine Spalte definiert als Primary Key ist per Definition eindeutig

    oder Du erstelt einen unique Index fuer die Spalte welche beim Einfuegen dann ueberprueft, dass der Wert nicht bereits existiert.

    Die evt. nahe liegendeste Loesung  des Clustered Index funktioniert nicht einfach so, da ein Clustered Index nicht per Definition eindeutig sein muss. Haeufig ist dies jedoch der Fall, dass der Clustered Index gerade auch als Primary Key definiert ist, dies ist aber nicht zwingend. Falls Du den Clustered Index nicht als Primary Key definiert moechtest/kannst, so kannst Du den Clustered Index als unique definieren und SQL Server stellt die Eindeutigkeit der Werte sicher.

    siehe die Beschreibung zu Create Index hier: http://msdn.microsoft.com/en-us/library/ms188783.aspx

    Beispiel C Createing a unique nonclustered index

    USE AdventureWorks2012;
    GO
    IF EXISTS (SELECT name from sys.indexes
                 WHERE name = N'AK_UnitMeasure_Name')
        DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;
    GO
    CREATE UNIQUE INDEX AK_UnitMeasure_Name 
        ON Production.UnitMeasure(Name);
    GO


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.


    • Bearbeitet Daniel_Steiner Mittwoch, 23. Januar 2013 18:54
    • Als Antwort markiert shewanja Mittwoch, 23. Januar 2013 19:54
    Mittwoch, 23. Januar 2013 18:51
  • Hallo Daniel,

    danke für deine schnelle Antwort. :-)

    In dieser Tabelle ist der Primärschlüssel einer anderen Spalte zugeordnet und hier ist die Eigenschaft CLUSTERED auch "ja". Wenn ich die Dokumenation richtig verstehe, kann ich nur bei einen Schlüssel pro Tabelle die Eigenschaft CLUSTERED auf ja setzen, damit bleibt mir nur noch ein unique Index.

    Warum fandest du den Clustered Index "evtl. naheliegender"?

    Mittwoch, 23. Januar 2013 19:17
  • Wenn ich die Dokumenation richtig verstehe, kann ich nur bei einen Schlüssel pro Tabelle die Eigenschaft CLUSTERED auf ja setzen, damit bleibt mir nur noch ein unique Index.

    korrekt, es kann nur hoechstens einen CLUSTERED INDEX pro Tabelle geben.

    Warum fandest du den Clustered Index "evtl. naheliegender"?

    damit wollte ich ausdruecken, dass viele Personen Clustered Index und Primary Key fuer das selbe halten und daher denken, dass der CLUSTERED INDEX automatisch eindeutig ist.

    In Deinem Beispiel kommst Du wohl um einen unique index (non clustered) nicht herum.


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    • Als Antwort markiert shewanja Mittwoch, 23. Januar 2013 19:54
    Mittwoch, 23. Januar 2013 19:32
  • Danke dir nochmals und noch einen schönen Abend :-)
    Mittwoch, 23. Januar 2013 19:54