Robert: MySQL: von zwei Spalten darf nur eine NULL sein

Hallöle,

wenn ich will, daß eine Spalte nicht NULL sein darf, geb ich beim CREATE TABLE für die entsprechende Spalte NOT NULL an, kein Problem.

Jetzt hab ich aber einen Fall, wo ich zwei Spalten (eine TEXT mit einem String, eine NR für eine Ganzzahl) habe, die nicht beide im gleichen Datensatz NULL sein dürfen, alle anderen Kombinationen sind erlaubt, also

TEXT   NR
"bla", 17     zulässig
"bla", NULL   zulässig
NULL,  17     zulässig
NULL,  NULL   NICHT zulässig

Kann man das irgendwie in der Tabellendefinition unterbringen?
Stored Procedures kann ich nicht nutzen (erlaubt der Provider nicht).

Das einzige, was mir einfiele, wäre, aus den zwei Spalten TEXT und NR mit Trennzeichen eine TEXT_NR zu machen, die dann nicht NULL werden darf, also z.B. "bla_1", "bla_", "_17", NULL  für die obigen Beispiele.
Das hätte aber wieder den Nachteil, daß Sortierung und Gruppierung nach den einzelnen (dann ja nicht mehr existierenden) Spalten aufwendig würde. Daher würde ich das gerne vermeiden.
Und die Spalte zusätzlich zu benutzen, hat dann wieder den Nachteil, daß die Daten redundant vorliegen und dabei immer die Gefahr besteht, daß irgendwann die Inhalte von TEXT + NR nicht mehr mit TEXT_NR zusammenpaßt.

Übersehe ich was?
Oder muß in so einem Fall wirklich die Application Logic dafür herhalten, die Korrektheit der Daten zu garantieren?

cu,
Robert

  1. Hi,

    in einer voll SQL-konformen Datenbank wäre das z.B. eine Anwendung für einen Check-Constraint. Leider scheitere ich dramatisch am MySQL-Manual und kann nicht rausfinden, ob sowas unterstützt wird, ich habe aber die Vermutung nein.
    ALTER TABLE xyz
    ADD CONSTRAINT mycheck
       CHECK text IS NOT NULL OR nr IS NOT NULL

    MfG
    Rouven

    --
    -------------------
    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
    1. Hallöle,

      in einer voll SQL-konformen Datenbank wäre das z.B. eine Anwendung für einen Check-Constraint. Leider scheitere ich dramatisch am MySQL-Manual und kann nicht rausfinden, ob sowas unterstützt wird, ich habe aber die Vermutung nein.
         CHECK text IS NOT NULL OR nr IS NOT NULL

      Ah. Nach dem Stichwort hab ich grad mal im Manual gestöbert. Und gefunden:

      The CHECK clause is parsed but ignored by all storage engines.

      Und ein kurzer Test bestätigt das auch. Beim CREATE TABLE wird der CHECK zwar akzeptiert, aber wenn dann Datensätze eingefügt werden sollen, die gegen den CHECK verstoßen, funktioniert der INSERT trotz Verletzung der bei CHECK angegebenen Regel ...

      cu,
      Robert