MySQL: von zwei Spalten darf nur eine NULL sein
Robert
- datenbank
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
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
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