nix: Identische Einträge trotz UNIQUE KEY

Hallo allerseits.

Ich habe ein Problem mit MySQL (5.0.32). Folgende Befehle erstellen das Testszenario:

CREATE TABLE testunique (id1 INT NOT NULL, id2 VARCHAR(512) NOT NULL, id3 VARCHAR(512) NULL, UNIQUE KEY (id1, id2, id3)) ENGINE InnoDB;

INSERT INTO testunique VALUES (1, "a", NULL);
INSERT INTO testunique VALUES (1, "a", NULL);

Der 2. INSERT-Befehl sollte meiner Meinung nach einen Fehler melden, jedoch fügt MySQL ganz normal den Datensatz ein und die Tabelle besteht aus zwei Zeilen. Das verwirrt mich, denn es sollte doch eigentlich nicht möglich sein, mit dem UNIQUE KEY einen zweiten identischen Eintrag zu erzeugen! Was ist da falsch?

Grüsse,
nix

  1. Moin!

    INSERT INTO testunique VALUES (1, "a", NULL);
    INSERT INTO testunique VALUES (1, "a", NULL);

    Der 2. INSERT-Befehl sollte meiner Meinung nach einen Fehler melden, jedoch fügt MySQL ganz normal den Datensatz ein und die Tabelle besteht aus zwei Zeilen. Das verwirrt mich, denn es sollte doch eigentlich nicht möglich sein, mit dem UNIQUE KEY einen zweiten identischen Eintrag zu erzeugen! Was ist da falsch?

    NULL ist der Wert mit Sonderbehandlung, der sich in vielen Belangen merkwürdig verhält. NULL ist beispielsweise gleich FALSE, aber auch gleich NICHT-FALSE.

    Hinsichtlich eines UNIQUE-Index kann es beliebig viele Spalten geben, die statt eines tatsächlichen Wertes (der dann einzigartig sein muß) den Wert NULL haben dürfen.

    Vermutlich wirkt sich diese Eigenschaft von NULL auch auf den zusammengesetzten UNIQUE-Index aus.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hinsichtlich eines UNIQUE-Index kann es beliebig viele Spalten geben, die statt eines tatsächlichen Wertes (der dann einzigartig sein muß) den Wert NULL haben dürfen.

      Vermutlich wirkt sich diese Eigenschaft von NULL auch auf den zusammengesetzten UNIQUE-Index aus.

      Wie schaffe ich dann meinen gewünschten Effekt? Ein PRIMARY KEY kann es nicht werden, der lässt ja keine NULL-Spalten zu. Ein UNIQUE KEY funktioniert ebenfalls nicht. Eine Idee? Oder geht das dann nur applikationsseitig?

      1. Wie schaffe ich dann meinen gewünschten Effekt? Ein PRIMARY KEY kann es nicht werden, der lässt ja keine NULL-Spalten zu. Ein UNIQUE KEY funktioniert ebenfalls nicht. Eine Idee? Oder geht das dann nur applikationsseitig?

        Ich habe jetzt die Spalte id3 auf NOT NULL gesetzt. Alle NULL-Werte sind jetzt leere Strings (""). Ob ich nun UNIQUE ODER PRIMARY KEY mache, ist egal, es funktioniert beides. Das ist mein kleiner Workaround, der für meine Anwendung ausreichend ist.

        nix

    2. Yerf!

      NULL ist der Wert mit Sonderbehandlung, der sich in vielen Belangen merkwürdig verhält. NULL ist beispielsweise gleich FALSE, aber auch gleich NICHT-FALSE.

      Vor allem liefert ein Vergleich mit NULL immer false, womit NULL != NULL gilt und die 2 Datenbankeinträge nicht identisch sind.

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      1. Moin!

        NULL ist der Wert mit Sonderbehandlung, der sich in vielen Belangen merkwürdig verhält. NULL ist beispielsweise gleich FALSE, aber auch gleich NICHT-FALSE.

        Vor allem liefert ein Vergleich mit NULL immer false, womit NULL != NULL gilt und die 2 Datenbankeinträge nicht identisch sind.

        Ach ja, richtig - so herum war's genau.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."