Twilo: Mysql 4.0: Unique Frage

Hallo,

hier ein Ausschnitt aus meinen Tabellen

Farben         Produkt      Produkt_has_Farbe
+----------+  +-------------+  +---------------+
| _farb_id |  | _produkt_id |  | _farb_id      |
+----------+  +-------------+  +---------------+
| ...      |  | ...         |  | _produkt_id   |
+----------+  +-------------+  +---------------+
                               | _default      |
                               +---------------+

_default ist im Moment enum(0,1)

geht so etwas

+---------------+---------------+---------------+
| _farb_id      | _produkt_id   | _default      |
+---------------+---------------+---------------+
| aaa           |       1       |       0       |
+---------------+---------------+---------------+
| bbb           |       1       |       0       |
+---------------+---------------+---------------+
| ccc           |       1       |       0       |
+---------------+---------------+---------------+
| yyy           |       1       |       1       |
+---------------+---------------+---------------+
| xxx           |       1       |       1       | <--- nicht zulässig, da es schon ein default gibt, bei der ProduktID
+---------------+---------------+---------------+

muss ich das selber lösen, dass ein Produkt nur ein Default haben kann, oder kann man das irgendwie mit der Datenbank lösen?

mfg
Twilo

  1. Hallo!

    muss ich das selber lösen, dass ein Produkt nur ein Default haben kann, oder kann man das irgendwie mit der Datenbank lösen?

    UNIQUE lässt unendlich vielen Zeilen mit NULL zu. Wenn Du also anstatt von "0" "NULL" verwendest, kann UNIQUE Dein Problem lösen.

    mysql> SELECT * FROM test;
    +------+
    | id   |
    +------+
    | NULL |
    |    1 |
    | NULL |
    | NULL |
    +------+
    4 rows in set (0.00 sec)

    mysql> INSERT INTO test (id) VALUES (1);
    ERROR 1062 (23000): Duplicate entry '1' for key 1

    Du solltest trotzdem über die Applikation testen, ob schon einmal "1"  existiert und vielleicht eine Fehlermeldung anzeigen.

    UNIQUE kann Dir lediglich helfen, die Datenintegrität zu wahren.

    André Laugks

    --
    Die Frau geht, die Hilti bleibt!
    1. Hallo,

      muss ich das selber lösen, dass ein Produkt nur ein Default haben kann, oder kann man das irgendwie mit der Datenbank lösen?

      UNIQUE lässt unendlich vielen Zeilen mit NULL zu. Wenn Du also anstatt von "0" "NULL" verwendest, kann UNIQUE Dein Problem lösen.

      dafür müßte ich dann aber int, z.B. tinyint nehmen, oder?
      hab es eben zu tinyint geändert, da funktioniert es :-)

      Du solltest trotzdem über die Applikation testen, ob schon einmal "1"  existiert und vielleicht eine Fehlermeldung anzeigen.
      UNIQUE kann Dir lediglich helfen, die Datenintegrität zu wahren.

      das ist klar, ich möchte damit nur verhindern, dass durch ein dummen Zufall 2 als "Standard" gekennzeichnet sind

      danke

      mfg
      Twilo

      1. Hallo!

        dafür müßte ich dann aber int, z.B. tinyint nehmen, oder?
        hab es eben zu tinyint geändert, da funktioniert es :-)

        Ich habe schon seit Ewigkeiten kein ENUM mehr verwendet. Ich bin mir nicht sicher, ob ENUM auch NULL kennt. Wenn nicht, müßte es so lauten:

        ENUM(1) DEFAULT NULL

        Bei einem Wert macht ENUM dann aber wieder keinen Sinn.

        ENUM ist eine Erfindung von MySQL. Wenn man eine Applikation eine für verschiedene Datenbankserver schreibt, kann man mit ENUM nicht anfangen. Bei anderen Datenbankservern, macht man das über eine 1:n Beziehung:

        id   AutoTyp
        1    Volvo
        2    Porsche
        3    BMW

        Name      id_AutoTyp
        André     1
        Ina       2
        Dieter    1
        Lias      3

        André Laugks

        --
        Die Frau geht, die Hilti bleibt!
        1. Hallo,

          dafür müßte ich dann aber int, z.B. tinyint nehmen, oder?
          hab es eben zu tinyint geändert, da funktioniert es :-)

          Ich habe schon seit Ewigkeiten kein ENUM mehr verwendet. Ich bin mir nicht sicher, ob ENUM auch NULL kennt. Wenn nicht, müßte es so lauten:

          ENUM(1) DEFAULT NULL

          hatte irgendwie nicht funktioniert, er hatte dann -1 eingetragen

          ENUM ist eine Erfindung von MySQL. Wenn man eine Applikation eine für verschiedene Datenbankserver schreibt, kann man mit ENUM nicht anfangen. Bei anderen Datenbankservern, macht man das über eine 1:n Beziehung:

          oh, das wußte ich nicht, danke für die Info :-)

          mfg
          Twilo