Announcement

Collapse
No announcement yet.

UNIQUE-Key

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

  • UNIQUE-Key

    Hallo zusammen,
    ich benutze den SQL-Server 2000.

    Gibt es eine Möglichkeit einen UNIQUE-Key auf eine Tabellenspalte zu legen und das trotzdem in dieser Spalte NULL ( leer ) zugelassen ist? Falls ja wie.

    Bei mir funktioniert das solange nur ein Eintrag NULL ist. Kommt der zweite bekomme ich eine Fehlermeldung „UNIQUE-Key“.

    Bin für jede Info dankbar

  • #2
    Hallo,

    die Aufgabe eines UNIQUE-Constraints besteht darin, in einer Tabelle nur Datensätze zuzulassen, deren Wert in diesem Feld eindeutig ist. Daher ist auch beim Zustand NULL nur ein einziger Datensatz zulässig.

    Wenn in der Tabelle beliebig viele Datensätze mit dem NULL-Zustand, aber nur eindeutige Datensätze mit einem ausgefüllten Wert unterstützt werden müssen, hilft ein INSTEAD OF-Trigger weiter. Der Trigger kann prüfen, ob das Feld einen Wert bekommen soll. Wenn ja, kann über eine 2. SELECT-Anweisung geprüft werden, ob der Wert eindeutig ist. Das Ganze könnte so aussehen:

    Code:
    USE tempdb
    GO
    
    CREATE TABLE InsertTriggerDemo
    (
      rec_id  INT         NOT NULL IDENTITY PRIMARY KEY,
      wert    NVARCHAR(9) NULL 
    )
    GO
    
    CREATE TRIGGER trInsertTriggerDemoIns 
      ON InsertTriggerDemo 
      INSTEAD OF INSERT 
    AS 
    BEGIN 
      DECLARE @wert NVARCHAR(9)
      SELECT @wert = wert FROM Inserted
      -- Fall 1 
      IF (@wert IS NOT NULL)
        BEGIN 
           IF (SELECT COUNT(*) FROM InsertTriggerDemo 
               WHERE wert = @wert) = 0
             BEGIN
               INSERT INTO InsertTriggerDemo (wert) 
                 SELECT wert FROM Inserted 
             END
          ELSE
            RAISERROR('Der Wert muss eindeutig sein', 16, 1);
        END 
      ELSE
        BEGIN 
          INSERT INTO InsertTriggerDemo (wert) 
            SELECT wert FROM Inserted 
        END 
    END
    GO
    
    INSERT INTO InsertTriggerDemo (wert) VALUES (NULL);  -- OK
    INSERT INTO InsertTriggerDemo (wert) VALUES (NULL);  -- OK
    INSERT INTO InsertTriggerDemo (wert) VALUES ('Test 1'); -- OK
    INSERT INTO InsertTriggerDemo (wert) VALUES ('Test 1');  -- Veto
    
    -- Ergebnis prüfen
    SELECT * FROM InsertTriggerDemo

    Comment

    Working...
    X