Virtabs: Syntax der CONSTRAINT-Anweisung

Die CONSTRAINT-Anweisung von VIRTUALTABLE

Mit “CONSTRAINT” werden Bedingungen definiert, denen ein Datensatz der Virtab genügen muss. In der Virtab-View wirken CONSTRAINTs als zusätzliche WHERE-Bedingungen, in dem Prozeduren werden die übergebenen Spalten-Argumente überprüft, ob sie allen CONSTRAINTs genügen.

Syntax:

Es gibt drei Formen der CONSTRAINT-Anweisung:

"CONSTRAINT" [ "NAME" constraint_name ] sql_expr [ "END" ]

"CONSTRAINT" [ "NAME" constraint_name ] "DEFAULT" virtab_colname
   "=" sql_ausdruck [ "END" ]

"CONSTRAINT" [ "NAME" constraint_name ] "DEFAULT" virtab_colname
   "IS NULL"  [ "END" ]

"CONSTRAINT" [ "NAME" constraint_name ] "UNIQUE"
   virtab_colname | "(" SQL-Bedingung ")"
   [ "," virtab_colname | "(" SQL-Bedingung ")"...] [ "END" ]

 

NAME

Optional kann für ein Constraint ein Name vereinbart werden. Das ist nötig, wenn das Constraint in abgeleiteteten Virtabs modifiziert werden soll.

sql_expr

Für den SQL-Ausdruck gelten dieselben Regeln wie in der “COLUMN ... DEFAULT”-Anweisung (Referenz hier).. Insbesondere können alle SQL-Vergleichsoperatoren sowie AND, OR etc. benutzt werden. Der Ausdruck muss aber ein boolsches Ergebnis liefern (TRUE, FALSE oder NULL).

Auf die besondere Behandlung von NULL in SQL-Ausdrücken sei hier hingewiesen: In SQL-Ausdrücken muss ein Vergleich auf NULL mittels “... IS [ NOT ]  NULL” erfolgen. “... = NULL” liefert immer ein NULL, also FALSE.

DEFAULT

CONSTRAINT DEFAULT beschreibt eine Constraint, das nicht nur eine einzelne Virtab-Spalte auf einen bestimmten Wert hin überprüft, sondern diese Spalte auch auf diesen Wert setzt, wenn der Anwender einen NULL-Wert übergeben hat.
“sql_ausdruck” muss dann die Form “virtab_colname = sql_ausdruck” oder “virtab_colname IS NULL” haben.

UNIQUE

Mit CONSTRAINT UNIQUE kann eine Liste von Bedingungen angegeben werden, die alle zusammen nur für einen Datensatz der Virtab-View erfüllt sein dürfen.
Diese Bedingungsliste besteht im einfachsten Fall aus einer Liste von Virtabfeldern. In diesem Fall wird geprüft, ob in der DB nohc ein Datensatz mit identischen Feldwerten existiert. CONSTRAINT UNIQUE funktioniert dann wie “CONSTRAINT UNIQUE(feld,feld,...)” des SQL92-Standards.

Anstelle eines Virtabfeldes kann in der Feldliste auch eine Vergleichsbedingung benutzt werden. Diese wird als beliebige SQL-Bedingung in “(...)” - Klammern angegeben. Innerhalb der SQL-Bedingung können Spalten des neuen/geänderten Datensatzes wie gehabt unter ihrem Virtab-Spaltennamen angesprochen werden, Spalten der vorhandenen Datensätze in der Datenbank müssen durch das Prefix “EXISTING.” gekennzeichnet werden.

Das UNIQUE-Constraint wird verletzt, wenn in der Virtab-View mehr als ein Record gefunden wird, für den alle gelisteten Bedingungen TRUE sind. (Daraus folgt, dass eine konstant falsche Bedingung, etwa “(NULL)”, das ganze CONSTRAINT wirkungslos macht.)
Ein einfaches Virtabfeld “vtcolumn” in der Liste ist übrigens die Kurzform für folgende SQL-Bedingung:

( vtcolumn = EXISTING.vtcolumn
OR ( vtcolumn IS NULL AND EXISTING.vtcolumn IS NULL)


Die Virtab-VIEW wird nach Ausführen der INSERT- oder der UPDATE-Prozedur geprüft, ob alle Records der View hinsichtlich der aufgelisteten Schlüsselfelder verschieden sind.
Ein UNIQUE-Constraint wirkt sich weder auf die View noch auf die DELETE-Prozedur aus .
Es können beliebig viele UNIQUE-Constraints angegeben werden.

UNIQUE-Constraints stellen eine Ergänzung zu den IDENTIFYING-Felder dar .IDENTIFYING-Felder werden für Datenbanktabellen definiert und sichern so die Eindeutigkeits der Schlüssel in der Datenbankschicht.
UNIQUE-Constraints können hingegen für jede Virtab verschieden definiert werden.

Ein Syntax-Beispiel: die Virtab DEPTS soll gegen mehrfache Einträge geschützt werden. Die Eindeutigkeit soll aber nicht case-sensitiv sein:

CONSTRAINT UNIQUE zip_code,
   ( UPPER(street) = UPPER(EXISTING.street) ),
   ( UPPER(departement) = UPPER(EXISTING.departement) )


END

Mit “END” kann das CONSTRAINT-Statement abgeschlossen werden, wenn dies wegen der Syntax des folgenden Befehls nötig werden sollte.

 

[Referenz] [ER2SQL cmdline] [DB-Voraussetzungen] [Definitionsfile-Aufbau] [Syntax: TABLE und LINK] [Syntax: VIRTUALTABLE] [Syntax: TABLE] [Syntax: COLUMN] [Syntax: CONSTRAINT] [Syntax: USES, MODIFY, ...] [Fehler von ER2SQL] [Laufzeitfehler] [Syntax-Hervorhebung] [SQL-Objekt-Namen]