Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Definition (DDL) → TABLE
Firebird Home Firebird Home Zurück: DOMAINFirebird Documentation IndexNach oben: Statements der Data Definition (DDL)Weiter: INDEX

TABLE

Inhaltsverzeichnis

CREATE TABLE
ALTER TABLE
DROP TABLE
RECREATE TABLE

Als relationales DBMS speichert Firebird Daten in Tabellen. Eine Tabelle ist eine flache, zweidimensionale Struktur, die eine beliebige Anzahl von Zeilen enthält. Tabellenzeilen werden oft als Datensätze bezeichnet.

Alle Zeilen in einer Tabelle haben die gleiche Struktur und bestehen aus Spalten. Tabellenspalten werden oft als Felder bezeichnet. Eine Tabelle muss mindestens eine Spalte haben. Jede Spalte enthält einen einzelnen Typ von SQL-Daten.

In diesem Abschnitt wird beschrieben, wie Sie Tabellen in einer Datenbank erstellen, ändern und löschen.

CREATE TABLE

Benutzt für: Erstellen einer neuen Tabelle (Relation)

Verfügbar in: DSQL, ESQL

Syntax: 

CREATE [GLOBAL TEMPORARY] TABLE tablename
		[EXTERNAL [FILE] '<filespec>']
	(<col_def> [, {<col_def> | <tconstraint>} ...])
	[ON COMMIT {DELETE | PRESERVE} ROWS];

<col_def> ::= <regular_col_def> | <computed_col_def>

<regular_col_def> ::=
  colname {<datatype> | domainname}
  [DEFAULT {literal | NULL | <context_var>}]
  [NOT NULL]
  [<col_constraint>]
  [COLLATE collation_name]

<computed_col_def> ::=
  colname [<datatype>]
  {COMPUTED [BY] | GENERATED ALWAYS AS} (<expression>)

<datatype> ::=
    {SMALLINT | INTEGER | BIGINT} [<array_dim>]
  | {FLOAT | DOUBLE PRECISION} [<array_dim>]
  | {DATE | TIME | TIMESTAMP} [<array_dim>]
  | {DECIMAL | NUMERIC} [(precision [, scale])] [<array_dim>]
  | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
    [<array_dim>] [CHARACTER SET charset_name]
  | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING]
    [(size)] [<array_dim>]
  | BLOB [SUB_TYPE {subtype_num | subtype_name}]
    [SEGMENT SIZE seglen] [CHARACTER SET charset_name]
  | BLOB [(seglen [, subtype_num])]

<array_dim> ::= [[m:]n [, [m:]n ...]]

<col_constraint> ::=
  [CONSTRAINT constr_name]
  {   PRIMARY KEY [<using_index>]
    | UNIQUE      [<using_index>]
    | REFERENCES other_table [(colname)] [<using_index>]
        [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
        [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
    | CHECK (<check_condition>) }

<tconstraint> ::=
  [CONSTRAINT constr_name]
  {   PRIMARY KEY (col_list) [<using_index>]
    | UNIQUE      (col_list) [<using_index>]
    | FOREIGN KEY (col_list)
        REFERENCES other_table [(col_list)] [<using_index>]
        [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
        [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
    | CHECK (<check_condition>) }"

<col_list> ::= colname [, colname ...]

<using_index> ::= USING
  [ASC[ENDING] | DESC[ENDING]] INDEX indexname

<check_condition> ::=
    <val> <operator> <val>
  | <val> [NOT] BETWEEN <val> AND <val>
  | <val> [NOT] IN (<val> [, <val> ...] | <select_list>)
  | <val> IS [NOT] NULL
  | <val> IS [NOT] DISTINCT FROM<val>
  | <val> [NOT] CONTAINING <val>
  | <val> [NOT] STARTING [WITH] <val>
  | <val> [NOT] LIKE <val> [ESCAPE <val>]
  | <val> [NOT] SIMILAR TO <val> [ESCAPE <val>]
  | <val> <operator> {ALL | SOME | ANY} (<select_list>)
  | [NOT] EXISTS (<select_expr>)
  | [NOT] SINGULAR (<select_expr>)
  | (<check_condition>)
  | NOT <check_condition>
  | <check_condition> OR <check_condition>
  | <check_condition> AND <check_condition>

<operator> ::= 
<> | != | ^= | ~= | = | < | > | <= | >= | !< | ^< | ~< | !> | ^> | ~>

<val> ::=
    colname [[<array_idx> [, <array_idx> ...]]]
  | literal
  | <context_var>
  | <expression>
  | NULL
  | NEXT VALUE FOR genname
  | GEN_ID(genname, <val>)
  | CAST(<val> AS <datatype>)
  | (<select_one>)
  | func([<val> [, <val> ...]])
        

Tabelle 5.7. CREATE TABLE Statement-Parameter

Parameter Beschreibung
tablename Name (Kennung) für die Tabelle. Sie kann aus bis zu 31 Zeichen bestehen und in der Datenbank eindeutig sein.
filespec Dateispezifikation (nur für externe Tabellen). Vollständiger Dateiname und Pfad, der in einfache Anführungszeichen eingeschlossen ist, unter Berücksichtigung der Regeln des lokalen Dateisystems. Die Datei muss physisch mit dem Host-Computer von Firebird verbunden sein.
colname Name (Bezeichner) für eine Spalte in der Tabelle. Kann aus bis zu 31 Zeichen bestehen und in der Tabelle eindeutig sein.
datatype SQL-Datentyp
col_constraint Spalten-Constraint
tconstraint Tabellen-Constraint
constr_name Der Name (Bezeichner) einer Einschränkung. Darf aus bis zu 31 Zeichen bestehen.
other_table Der Name der Tabelle, auf die die Constraint verweist
other_col Der Name der Spalte in other_table , auf die der Fremdschlüssel verweist
literal Ein Literalwert, der im angegebenen Kontext zulässig ist
context_var Beliebige Kontextvariable, deren Datentyp im angegebenen Kontext zulässig ist
check_condition Die Bedingung, die auf eine CHECK-Einschränkung angewendet wird, die als wahr, false oder NULL aufgelöst wird.
collation Collation
array_dim Array-Dimensionen
m, n INTEGER-Ganzzahlen die den Bereich der Array-Dimensionen angeben
precision Die Gesamtzahl der signifikanten Ziffern, die ein Wert des Datentyps halten kann (1..18)
scale Die Anzahl Stellen nach dem Dezimalkomma (0..precision)
size Die maximale Größe eines Strings in Zeichen
charset_name Der Name eines gültigen Zeichensatzes, falls der Zeichensatz der Spalte vom Standardzeichensatz der Datenbank abweichen soll
subtype_num BLOB-Subtype-Nummer
subtype_name BLOB-Subtyp-Mnemonikname
seglen Segmentgröße (max. 65535)
select_one Eine skalare SELECT-Anweisung — auswählen einer Spalte und zurückgeben nur einer Zeile
select_list Eine SELECT-Anweisung, die eine Spalte auswählt und null oder mehr Zeilen zurückgibt
select_expr Eine SELECT-Anweisung, die eine oder mehrere Spalten auswählt und null oder mehr Zeilen zurückgibt
expression Ein Ausdruck, der auf einen Wert auflöst, der im angegebenen Kontext zulässig ist
genname Sequenzname (Generatorname)
func Interne Funktion oder UDF


Die Anweisung CREATE TABLE erstellt eine neue Tabelle. Jeder Benutzer kann sie erstellen und ihr Name muss unter den Namen aller Tabellen, Ansichten und gespeicherten Prozeduren in der Datenbank eindeutig sein.

Eine Tabelle muss mindestens eine Spalte enthalten, die nicht berechnet wird, und die Namen der Spalten müssen in der Tabelle eindeutig sein.

Eine Spalte muss entweder einen expliziten SQL-Datentyp, den Namen einer Domain, dessen Attribute für die Spalte kopiert werden oder als COMPUTED BY-Ausdruck (ein berechnetes Feld).

Eine Tabelle kann eine beliebige Anzahl von Tabelleneinschränkungen haben, einschließlich keiner.

Eine Spalte nicht nullbar machen

In Firebird sind Spalten standardmäßig nullwertig. Die optionale NOT NULL-Klausel gibt an, dass die Spalte NULL anstelle eines Wertes nicht verwenden darf.

Zeichen-Spalten

Sie können die CHARACTER SET-Klausel verwenden, um den Zeichensatz für die Typen CHAR, VARCHAR und BLOB (SUB_TYPE TEXT) anzugeben. Wenn der Zeichensatz nicht angegeben ist, wird standardmäßig der während der Erstellung der Datenbank angegebene Zeichensatz verwendet. Wurde während der Erstellung der Datenbank kein Zeichensatz angegeben, wird standardmäßig der Zeichensatz NONE übernommen. In diesem Fall werden Daten gespeichert und abgerufen, wie sie übermittelt wurden. Daten in einer beliebigen Kodierung können zu einer solchen Spalte hinzugefügt werden, aber es ist nicht möglich, diese Daten zu einer Spalte mit einer anderen Kodierung hinzuzufügen. Keine Transliteration wird zwischen den Quell- und Zielcodierungen, das dies zu Fehlern führen kann.

Mit der optionalen COLLATE-Klausel können Sie die Sortierreihenfolge für Zeichendatentypen angeben, einschließlich BLOB SUB_TYPE TEXT. Wenn keine Sortierreihenfolge angegeben ist, wird standardmäßig die Sortierreihenfolge angewendet, die für den angegebenen Zeichensatz beim Erstellen der Spalte standardmäßig verwendet wird.

Angabe eines DEFAULT-Wertes

Die optionale DEFAULT-Klausel erlaubt Ihnen, den Standardwert für eine Tabellenspalte festzulegen. Dieser Wert wird der Spalte während der Ausführung eines INSERT-Statements zugewiesen, sofern kein anderer Wert festgelegt wurde und diese Spalte von der INSERT-Anweisung ausgelassen wurde.

Der Standardwert kann ein Literal eines kompatiblen Typs sein, eine Kontextvariable, die mit dem Datentyp der Spalte typkompatibel ist, oder NULL, wenn die Spalte dies zulässt. Wenn kein Standardwert explizit angegeben ist, wird NULL impliziert.

Ein Ausdruck kann nicht als Standardwert verwendet werden.

Domain-basierte Spalten

Um eine Spalte zu definieren, können Sie eine zuvor definierte Domain verwenden. Wenn die Definition einer Spalte auf einer Domain basiert, enthält sie möglicherweise einen neuen Standardwert, zusätzliche CHECK-Einschränkungen und eine COLLATE-Klausel, die die in der Domain angegebenen Werte überschreibt. Die Definition einer solchen Spalte kann zusätzliche Spaltenbeschränkungen enthalten (z. B. NOT NULL), wenn die Domain diese nicht besitzt.

Wichtig

Es ist nicht möglich, eine Domain-basierte Spalte zu definieren, die nullbar ist, wenn die Domain mit dem Attribut NOT NULL definiert wurde. Wenn Sie eine Domain haben möchten, die zum Definieren sowohl von nullbaren als auch von nicht-nullbaren Spalten und Variablen verwendet werden kann, empfiehlt es sich, die Domain auf null zu setzen und NOT NULL in der Spaltendefinition zu verwenden.

Berechnete Felder

Berechnete Felder können in der Datenbank mittels COMPUTED [BY] oder GENERATED ALWAYS AS (gemäß SQL: 2003 Standard) definiert werden. Sie meinen dasselbe. Das Beschreiben des Datentyps ist für berechnete Felder nicht erforderlich (aber möglich), da das DBMS den entsprechenden Typ als Ergebnis der Ausdrucksanalyse berechnet und speichert. Entsprechende Operationen für die in einem Ausdruck enthaltenen Datentypen müssen genau angegeben werden.

Wenn der Datentyp explizit für ein berechnetes Feld angegeben wird, wird das Berechnungsergebnis in den angegebenen Typ konvertiert. Dies bedeutet zum Beispiel, dass das Ergebnis eines numerischen Ausdrucks als String dargestellt werden kann.

In einer Abfrage, die eine COMPUTED BY-Spalte auswählt, wird der Ausdruck für jede Zeile der ausgewählten Daten ausgewertet.

Tipp

Anstelle einer berechneten Spalte ist es in manchen Fällen sinnvoll, eine reguläre Spalte zu verwenden, deren Wert in Triggern zum Hinzufügen und Aktualisieren von Daten ausgewertet wird. Es kann die Leistung des Einfügens / Aktualisierens von Datensätzen verringern, aber es wird die Leistung der Datenabfrage erhöhen.

Definieren einer ARRAY-Spalte

  • Wenn die Spalte ein Array sein soll, kann der Basistyp ein beliebiger SQL-Datentyp sein, mit Ausnahme von BLOB und ARRAY.
  • Die Grenzen des Arrays werden in eckigen Klammern angegeben. (Im Syntaxblock werden diese Klammern fett dargestellt, um sie von eckigen Klammern zu unterscheiden, die optionale Syntaxelemente kennzeichnen.
  • Für jede Array-Dimension definieren eine oder zwei ganze Zahlen die untere und obere Grenze ihres Indexbereichs:
    • Standardmäßig sind Arrays 1-basiert. Die untere Grenze ist implizit und nur die obere Grenze muss angegeben werden. Eine einzelne Zahl kleiner als 1 definiert den Bereich num . 1 und eine Zahl größer als 1 definiert den Bereich 1.. num .
    • Zwei durch einen Doppelpunkt getrennte Zahlen (':') und optionaler Leerraum, der zweite ist größer als der erste, können verwendet werden, um den Bereich explizit zu definieren. Eine oder beide Grenzen können kleiner als Null sein, solange die obere Grenze größer als die untere ist.
  • Wenn das Array mehrere Dimensionen hat, müssen die Bereichsdefinitionen für jede Dimension durch Kommas und optionales Leerzeichen getrennt werden.
  • Indizes werden nur validiert, wenn ein Array tatsächlich existiert. Dies bedeutet, dass keine Fehlermeldungen bezüglich ungültiger Subskripte zurückgegeben werden, wenn ein bestimmtes Element nichts zurückgibt oder wenn ein Array-Feld NULL ist.

Constraints

Es gibt vier Constraint-Typen. Diese sind:

  • Primärschlüssel (PRIMARY KEY)
  • Eindeutigkeitsschlüssel (UNIQUE)
  • Fremdschlüssel(REFERENCES)
  • CHECK-Constraint (CHECK)

Constraints können auf Spaltenebene („Spaltenbeschränkungen“) oder auf Tabellenebene („Tabellenbeschränkungen“) angegeben werden. Einschränkungen auf Tabellenebene sind erforderlich, wenn Schlüssel (Eindeutigkeitsbeschränkung, Primärschlüssel, Fremdschlüssel) über mehrere Spalten hinweg gebildet werden sollen und wenn eine CHECK-Einschränkung neben der definierten Spalte andere Spalten in der Zeile einbezieht. Die Syntax für einige Constraint-Typen kann je nachdem, ob die Constraint auf Spalten- oder Tabellenebene definiert wird, leicht unterschiedlich sein.

  • Eine Spaltenbeschränkung wird während einer Spaltendefinition angegeben, nachdem alle Spaltenattribute, mit Ausnahme von COLLATION, angegeben wurden und nur die in dieser Definition angegebene Spalte enthalten ist
  • Einschränkungen auf Tabellenebene werden nach allen Spaltendefinitionen angegeben. Sie sind ein flexiblerer Weg, um Einschränkungen festzulegen, da sie Einschränkungen für mehrere Spalten berücksichtigen können
  • Sie können Einschränkungen auf Tabellen- und Spaltenebene im gleichen CREATE TABLE-Statement mischen

Das System erstellt automatisch den entsprechenden Index für einen Primärschlüssel (PRIMARY KEY), einen eindeutigen Schlüssel (UNIQUE) und einen Fremdschlüssel (REFERENCES ist eine Einschränkung auf Spaltenebene, FOREIGN KEY REFERENCES eine auf Tabellenebene).

Name für Constraints und ihre Indizes

Spaltenbeschränkungen und ihre Indizes werden automatisch benannt:

  • Der Constraint-Name besitzt die Form INTEG_n, wobei n ein oder mehrere Ziffern repräsentiert
  • Der Indexname besitzt die Form RDB$PRIMARYn (für einen Primärschlüsselindex), RDB$FOREIGNn (für einen Fremdschlüsselindex) oder RDB$n (für einen Eindeutigkeitsindex). Auch hier repräsentiert n eine oder mehrere Ziffern.

Die automatische Benennung von Einschränkungen auf Tabellenebene und deren Indizes folgt dem gleichen Muster, es sei denn, die Namen werden explizit angegeben.

Benannte Constratints

Ein Constraint kann explizit benannt werden, wenn für ihre Definition die CONSTRAINT-Klausel verwendet wird. Die CONSTRAINT-Klausel ist optional für die Definition von Spaltentypen auf Spaltenebene. Sie ist jedoch obligatorisch für Tabellenstufen. Standardmäßig hat der Constraint-Index denselben Namen wie die Constraint. Wenn für den Constraint-Index ein anderer Name gewünscht wird, kann eine USING-Klausel enthalten sein.

Die USING-Klausel

Die Klausel USING erlaubt Ihnen die benutzerdefiniserte Benennung des Index, der automatisch erstellt wurde und, optional, die Definition der Indexrichtigung —entweder aufsteigend (Standardwert) oder absteigend.

PRIMARY KEY

Der PRIMARY KEY-Constraint wird auf einer oder mehr Schlüsselspalten gebildet, wobei jede Spalte mit einem NOT NULL-Constraint definiert wurde. Die Werte in den Schlüsselspalten einer Zeile müssen eindeutig sein. Eine Tabelle kann nur einen Primärschlüssel enthalten.

  • Ein einspaltiger Primärschlüssel kann als Spalten- oder Tabellenebene definiert werden
  • Ein mehrspaltiger Primärschlüssel muss als Einschränkung auf Tabellenebene angegeben werden.

Der UNIQUE-Constraint

Die Einschränkung UNIQUE definiert die Anforderung der Eindeutigkeit des Inhalts für die Werte in einem Schlüssel in der gesamten Tabelle. Eine Tabelle kann eine beliebige Anzahl von eindeutigen Schlüsseleinschränkungen enthalten.

Wie beim Primärschlüssel kann die eindeutige Einschränkung mehrspaltig sein. Ist dies der Fall, muss es als Einschränkung auf Tabellenebene angegeben werden.

NULL in Eindeutigkeitsschlüsseln

Die SQL-99-konformen Regeln für UNIQUE-Constraints erlauben einen oder mehrere NULLs in einer Spalte mit einem UNIQUE-Constraint. Dadurch ist es möglich, eine UNIQUE-Beschränkung für eine Spalte zu definieren, die nicht die Einschränkung NOT NULL hat.

Bei UNIQUE-Schlüsseln, die mehrere Spalten umfassen, ist die Logik ein wenig kompliziert:

  • Mehrere Zeilen mit Null in allen Spalten des Schlüssels sind erlaubt
  • Mehrere Zeilen mit Schlüsseln mit verschiedenen Kombinationen von Nullen und Nicht-Null-Werten sind erlaubt
  • Mehrere Zeilen mit denselben Schlüsselspalten null und der Rest mit Werten ungleich null sind zulässig, sofern sich die Werte in mindestens einer Spalte unterscheiden
  • Mehrere Zeilen mit denselben Schlüsselspalten null und der Rest mit Nicht-Nullwerten, die in jeder Spalte gleich sind, verletzen die Bedingung

Die Regeln für die Eindeutigkeit lassen sich so zusammenfassen:

Im Prinzip werden alle Nullen als eindeutig betrachtet. Wenn jedoch zwei Zeilen exakt die gleichen Schlüsselspalten aufweisen, die mit Werten gefüllt sind, die nicht Null sind, werden die NULL-Spalten ignoriert und die Eindeutigkeit wird für Spalten ohne Null festgelegt, als ob sie den gesamten Schlüssel bilden würden.

Illustration: 

RECREATE TABLE t( x int, y int, z int, unique(x,y,z));
INSERT INTO t values( NULL, 1, 1 );
INSERT INTO t values( NULL, NULL, 1 );
INSERT INTO t values( NULL, NULL, NULL );
INSERT INTO t values( NULL, NULL, NULL ); -- Erlaubt
INSERT INTO t values( NULL, NULL, 1 );    -- Nicht erlaubt
                

FOREIGN KEY

Ein Fremdschlüssel stellt sicher, dass die teilnehmenden Spalten nur Werte enthalten dürfen, die auch in der referenzierten Spalte (n) in der Mastertabelle vorhanden sind. Diese referenzierten Spalten werden oft als Zielspalten bezeichnet. Sie müssen der Primärschlüssel oder ein eindeutiger Schlüssel in der Zieltabelle sein. Sie müssen keine NOT NULL-Einschränkung definiert haben, obwohl sie, wenn sie der Primärschlüssel sind, natürlich diese Einschränkung haben.

Die Fremdschlüsselspalten in der referenzierenden Tabelle selbst erfordern keine NOT NULL-Einschränkung.

Ein einspaltiger Fremdschlüssel kann in der Spaltendeklaration definiert werden, wobei das Schlüsselwort REFERENCES verwendet wird:

... ,
ARTIFACT_ID INTEGER REFERENCES COLLECTION (ARTIFACT_ID),
            

Die Spalte ARTIFACT_ID im Beispiel verweist auf eine gleichnamige Spalte in der Tabelle COLLECTIONS.

Sowohl einspaltige als auch mehrspaltige Fremdschlüssel können auf der Tabellenebene definiert werden. Bei einem mehrspaltigen Fremdschlüssel ist die Deklaration auf Tabellenebene die einzige Option. Diese Methode ermöglicht auch die Angabe eines optionalen Namens für die Einschränkung:

...
CONSTRAINT FK_ARTSOURCE FOREIGN KEY(DEALER_ID, COUNTRY)
  REFERENCES DEALER (DEALER_ID, COUNTRY),
            

Beachten Sie, dass sich die Spaltennamen in der referenzierten Tabelle („master“) möglicherweise von denen im Fremdschlüssel unterscheiden.

Anmerkung

Wenn keine Zielspalten angegeben sind, verweist der Fremdschlüssel automatisch auf den Primärschlüssel der Zieltabelle.

Fremdschlüsselaktionen

Mit den Unterklauseln ON UPDATE und ON DELETE ist es möglich, eine Aktion für die betroffenen Fremdschlüsselspalte anzugeben, wenn referenzierte Werte in der Mastertabelle geändert werden:

  • NO ACTION (der Standard) - nichts wird getan
  • CASCADE - Die Änderung in der Mastertabelle wird an die entsprechende(n) Zeile(n) in der untergeordneten Tabelle weitergegeben. Wenn sich ein Schlüsselwert ändert, ändert sich der entsprechende Schlüssel in den untergeordneten Datensätzen auf den neuen Wert; Wenn die Master-Zeile gelöscht wird, werden die untergeordneten Datensätze gelöscht.
  • SET DEFAULT - Die Fremdschlüsselspalten in den betroffenen Zeilen werden wie bei der Definition der Fremdschlüsselbeschränkung auf ihre Standardwerte gesetzt.
  • SET NULL - Die Fremdschlüssel-Spalten in den betroffenen Zeilen werden auf NULL gesetzt.

Die angegebene Aktion oder die Standardeinstellung NO ACTION könnte dazu führen, dass eine Fremdschlüsselspalte ungültig wird. Beispielsweise könnte er einen Wert erhalten, der in der Mastertabelle nicht vorhanden ist, oder er könnte NULL werden, während die Spalte eine NOT NULL-Einschränkung hat. Solche Bedingungen führen dazu, dass die Operation in der Master-Tabelle mit einer Fehlermeldung fehlschlägt.

Beispiel: 

...
  CONSTRAINT FK_ORDERS_CUST
    FOREIGN KEY (CUSTOMER) REFERENCES CUSTOMERS (ID)
    ON UPDATE CASCADE ON DELETE SET NULL
              
CHECK-Constraint

Die Bedingung CHECK definiert die Bedingung, die die in diese Spalte eingefügten Werte erfüllen müssen. Eine Bedingung ist ein logischer Ausdruck (auch Prädikat genannt), der die Werte TRUE, FALSE und UNKNOWN zurückgeben kann. Eine Bedingung gilt als erfüllt, wenn das Prädikat TRUE oder den Wert UNKNOWN (entspricht NULL) zurückgibt. Wenn das Prädikat FALSE zurückgibt, wird der Wert nicht akzeptiert. Diese Bedingung wird zum Einfügen einer neuen Zeile in die Tabelle (die Anweisung INSERT) und zum Aktualisieren des vorhandenen Werts der Tabellenspalte (die Anweisung UPDATE wo eine dieser Aktionen stattfinden kann (UPDATE ODER INSERT, MERGE).

Wichtig

Eine CHECK-Beschränkung für eine Domainbasierte Spalte ersetzt eine vorhandene CHECK-Bedingung in der Domain nicht, sondern wird zu einer Ergänzung. Die Firebird-Engine hat während der Definition keine Möglichkeit zu überprüfen, ob der zusätzliche CHECK nicht mit dem vorhandenen übereinstimmt.

CHECK-Bedingungen — ob auf Tabellen- oder Spaltenebene definiert — beziehen sich auf Tabellenspalten durch ihren Namen. Die Verwendung des Schlüsselworts VALUE als Platzhalter wie auch in der CHECK-Bedingung für Domains ist im Kontext der Definition von Spalteneinschränkungen nicht zulässig.

Beispiele:  mit zwei Einschränkungen auf Spaltenebene und einer auf Tabellenebene:

CREATE TABLE PLACES (
  ...
  LAT DECIMAL(9, 6) CHECK (ABS(LAT) <=  90),
  LON DECIMAL(9, 6) CHECK (ABS(LON) <= 180),
  ...
  CONSTRAINT CHK_POLES CHECK (ABS(LAT) < 90 OR LON = 0)
                     );
              

Global Temporary Tables (GTT)

Global Temporary Tables haben persistente Metadaten, aber ihre Inhalte sind transaktions- (Standard) oder verbindungsgebunden. Jede Transaktion oder Verbindung hat eine eigene private Instanz eines GTT, isoliert von allen anderen. Instanzen werden nur dann erstellt, wenn auf das GTT verwiesen wird. Sie werden beim Beenden der Transaktion oder beim Trennen zerstört. Die Metadaten eines GTT können mit ALTER TABLE bzw. DROP TABLE geändert oder entfernt werden.

Syntax: 

CREATE GLOBAL TEMPORARY TABLE name
  (<column_def> [, {<column_def> | <table_constraint>} ...])
  [ON COMMIT {DELETE | PRESERVE} ROWS]
            

Hinweise zur Syntax

  • ON COMMIT DELETE ROWS erstellt eine transaktionsgebundene GTT (der Standard) ON COMMIT PRESERVE ROWS eine verbindungsgebundene GTT
  • Eine EXTERNAL [FILE]-Klausel ist nicht zulässig in der Definition einer GTT
Einschränkungen für GTTs

GTTs können mit allen Features und Utensilien gewöhnlicher Tabellen (Schlüssel, Referenzen, Indizes, Trigger usw.) „ausgestattet werden“, aber es gibt einige Einschränkungen:

  • GTTs und reguläre Tabellen können sich nicht gegenseitig referenzieren
  • Eine verbindungsgebundene („PRESERVE ROWS“) GTT kann nicht auf eine transaktionsgebundene („DELETE ROWS“) GTT verweisen
  • Domain-Constraints können nicht auf GTTs verweisen
  • Die Zerstörung einer GTT-Instanz am Ende ihres Lebenszyklus löst keine BEFORE / AFTER-Löschtrigger aus

Tipp

In einer vorhandenen Datenbank ist es nicht immer einfach, eine reguläre Tabelle von einer GTT oder einer GTT auf Transaktions- von einer GTT auf Verbindungsebene zu unterscheiden. Verwenden Sie diese Abfrage, um herauszufinden, welche Art von Tabelle Sie betrachten:

select t.rdb$type_name
  from rdb$relations r
  join rdb$types t on r.rdb$relation_type = t.rdb$type
    where t.rdb$field_name = 'RDB$RELATION_TYPE'
    and r.rdb$relation_name = 'TABLENAME'
            

Für einen Überblick über die Typen aller Beziehungen in der Datenbank:

    select r.rdb$relation_name, t.rdb$type_name
    from rdb$relations r
    join rdb$types t on r.rdb$relation_type = t.rdb$type
    where t.rdb$field_name = 'RDB$RELATION_TYPE'
    and coalesce (r.rdb$system_flag, 0) = 0
            

Das Feld RDB$TYPE_NAME zeigt PERSISTENT für eine reguläre Tabelle, VIEW für eine Ansicht, GLOBAL_TEMPORARY_PRESERVE für eine verbindungsgebundene GTT und GLOBAL_TEMPORARY_DELETE für eine transaktionsgebundene GTT.

Externe Tabellen

Die optionale Klausel EXTERNAL [FILE] gibt an, dass die Tabelle außerhalb der Datenbank in einer externen Textdatei mit Datensätzen fester Länge gespeichert wird. Die Spalten einer Tabelle, die in einer externen Datei gespeichert sind, können von einem beliebigen Typ außer BLOB oder ARRAY sein.

Alles, was Sie mit einer in einer externen Datei gespeicherten Tabelle tun können, ist, neue Zeilen einzufügen (INSERT) und die Daten abzufragen). Das Aktualisieren vorhandener Daten (UPDATE) und das Löschen von Zeilen (DELETE) sind nicht möglich.

Eine Datei, die als externe Tabelle definiert ist, muss sich auf einem Speichergerät befinden, das physisch auf dem Computer vorhanden ist, auf dem der Firebird-Server ausgeführt wird. Wenn der Parameter ExternalFileAccess in der Konfigurationsdatei firebird.conf auf Restrict lautet, muss in einem der dort aufgeführten Verzeichnisse das Argument für Restrict stehen. Wenn die Datei nicht schon existiert, wird Firebird diese beim ersten Zugriff erstellen.

Wichtig

Die Möglichkeit, externe Dateien für eine Tabelle zu verwenden, hängt vom Wert ab, der für den Parameter ExternalFileAccess in firebird.conf festgelegt wurde:

  • Wenn der Parameter auf None (Standardeinstellung) eingestellt ist, wird jeder Zugriff auf eine externe Datei verweigert.
  • Die Einstellung Restrict wird empfohlen, um den Zugriff externer Dateien auf Verzeichnisse einzuschränken, die vom Serveradministrator explizit für diesen Zweck erstellt wurden. Beispielsweise:
    • ExternalFileAccess = Restrict externalfiles schränkt den Zugriff auf ein Verzeichnis namens externalfiles direkt unterhalb des Firebird Wurzelverzeichnisses ein
    • ExternalFileAccess = d:\databases\outfiles; e:\infiles schränkt den Zugriff auf die zwei angegebenen Verzeichnisse des Windows-Hostservers ein. Beachten Sie, dass jeder Pfad, der eine Netzwerkzuordnung ist, nicht funktioniert. Pfade, die in einfachen oder doppelten Anführungszeichen eingeschlossen sind, funktionieren auch nicht.
  • Wenn dieser Parameter auf Full eingestellt ist, kann auf externe Dateien im Host-Dateisystem zugegriffen werden. Es schafft eine Sicherheitslücke und wird nicht empfohlen.

Externes Dateiformat

Das „Zeilen“-Format einer externen Tabelle besteht aus fester Länge. Es gibt keine Feldbegrenzer: Sowohl Feld- als auch Zeilengrenzen werden durch die maximale Größe der Felddefinitionen in Bytes bestimmt. Dies ist sowohl beim Definieren der Struktur der externen Tabelle als auch beim Entwerfen einer Eingabedatei für eine externe Tabelle wichtig, die Daten aus einer anderen Anwendung importieren soll. Das ubiquitäre „.csv“-Format ist z. B. nicht nützlich als Eingabedatei und kann nicht direkt in eine externe Datei generiert werden.

Der nützlichste Datentyp für die Spalten externer Tabellen ist der Typ CHAR mit fester Länge mit geeigneten Längen für die Daten, die sie tragen sollen. Datums- und Zahlentypen können problemlos zu und von Zeichenketten umgewandelt werden, solange die Dateien nicht von einer anderen Firebird-Datenbank gelesen werden sollen, werden die nativen Datentypen externen Anwendungen als unparsbar „alphabetti“ angezeigt.

Natürlich gibt es Möglichkeiten, typisierte Daten zu manipulieren, um Ausgabedateien von Firebird zu generieren, die als Eingabedateien für andere Anwendungen mithilfe von gespeicherten Prozeduren mit oder ohne externe Tabellen gelesen werden können. Solche Techniken liegen außerhalb des Bereichs einer Sprachreferenz. Hier finden Sie einige Richtlinien und Tipps zum Erstellen und Arbeiten mit einfachen Textdateien, da die externe Tabellenfunktion häufig als einfache Möglichkeit zum Erstellen oder Lesen von transaktionsunabhängigen Protokollen verwendet wird, die offline in einem Texteditor oder in einem Auditing untersucht werden können Anwendung.

Zeilenbegrenzer

Im Allgemeinen sind externe Dateien nützlicher, wenn Zeilen durch ein Trennzeichen in Form einer „newline“-Sequenz getrennt werden, die von Leseanwendungen auf der vorgesehenen Plattform erkannt wird. Für die meisten Kontexte unter Windows ist dies die Zwei-Byte-CRLF-Sequenz, Wagenrücklauf (ASCII-Code dezimal 13) und Zeilenvorschub (ASCII-Code dezimal 10). Auf POSIX ist LF für sich allein üblich; Bei einigen MacOSX-Anwendungen kann es sich um LFCR handeln. Es gibt verschiedene Möglichkeiten, diese Begrenzerspalte zu füllen. In unserem Beispiel unten geschieht dies mittel Before Insert-Trigger und der internen Funktion ASCII_CHAR.

Beispiel einer externen Tabelle

In unserem Beispiel definieren wir eine externe Protokolltabelle, die von einem Ausnahmehandler in einer gespeicherten Prozedur oder einem Trigger verwendet werden kann. Die externe Tabelle wird ausgewählt, da die Nachrichten aus den behandelten Ausnahmen im Protokoll beibehalten werden, selbst wenn die Transaktion, die den Prozess gestartet hat, aufgrund einer anderen, nicht behandelten Ausnahme schließlich zurückgesetzt wird. Zu Demonstrationszwecken gibt es nur zwei Datenspalten, einen Zeitstempel und eine Nachricht. Die dritte Spalte speichert den Zeilenbegrenzer:

CREATE TABLE ext_log
  EXTERNAL FILE 'd:\externals\log_me.txt' (
  stamp CHAR (24),
  message CHAR(100),
  crlf CHAR(2) );  -- for a Windows context
COMMIT;
           

Jetzt noch einen Trigger erstellen, der Zeitstempel und Zeilenbegrenzer festlegt, sobald eine Nachricht in die Datei geschrieben wird:

SET TERM ^;
CREATE TRIGGER bi_ext_log FOR ext_log
ACTIVE BEFORE INSERT
AS
BEGIN
  IF (new.stamp is NULL) then
    new.stamp = CAST (CURRENT_TIMESTAMP as CHAR(24));
  new.crlf = ASCII_CHAR(13) || ASCII_CHAR(10);
END ^
COMMIT ^
SET TERM ;^
           

Einfügen von Datensätzen (die von einem Exception-Handler oder Shakespeare-Fan gemacht worden sein könnten):

insert into ext_log (message)
values('Shall I compare thee to a summer''s day?');
insert into ext_log (message)
values('Thou art more lovely and more temperate')
           

Die Ausgabe:

2015-10-07 15:19:03.4110Shall I compare thee to a summer's day?
2015-10-07 15:19:58.7600Thou art more lovely and more temperate
           

Beispiele für CREATE TABLE

  1. Erstellen der Tabelle COUNTRY mit dem als Spaltenbeschränkung angegebenen Primärschlüssel.
    CREATE TABLE COUNTRY (
      COUNTRY COUNTRYNAME NOT NULL PRIMARY KEY,
      CURRENCY VARCHAR(10) NOT NULL);
                
  2. Erstellen der STOCK-Tabelle mit dem auf der Spaltenebene angegebenen benannten Primärschlüssel und dem auf der Tabellenebene angegebenen benannten eindeutigen Schlüssel.
    CREATE TABLE STOCK (
      MODEL SMALLINT NOT NULL CONSTRAINT PK_STOCK PRIMARY KEY,
      MODELNAME CHAR(10) NOT NULL,
      ITEMID INTEGER NOT NULL,
      CONSTRAINT MOD_UNIQUE UNIQUE (MODELNAME, ITEMID));
                
  3. Erstellen der JOB-Tabelle mit einer Primärschlüsselbeschränkung, die zwei Spalten umfasst, eine Fremdschlüsselbeschränkung für die Tabelle COUNTRY und eine CHECK-Einschränkung auf Tabellenebene. Die Tabelle enthält außerdem eine Reihe von 5 Elementen.
    CREATE TABLE JOB (
        JOB_CODE         JOBCODE NOT NULL,
        JOB_GRADE        JOBGRADE NOT NULL,
        JOB_COUNTRY      COUNTRYNAME,
        JOB_TITLE        VARCHAR(25) NOT NULL,
        MIN_SALARY       NUMERIC(18, 2) DEFAULT 0 NOT NULL,
        MAX_SALARY       NUMERIC(18, 2) NOT NULL,
        JOB_REQUIREMENT  BLOB SUB_TYPE 1,
        LANGUAGE_REQ     VARCHAR(15) [1:5],
        PRIMARY KEY (JOB_CODE, JOB_GRADE),
        FOREIGN KEY (JOB_COUNTRY) REFERENCES COUNTRY (COUNTRY)
        ON UPDATE CASCADE
        ON DELETE SET NULL,
        CONSTRAINT CHK_SALARY CHECK (MIN_SALARY < MAX_SALARY)
    );
                
  4. Erstellen der PROJECT-Tabelle mit Primär-, Fremd- und eindeutigen Schlüsseleinschränkungen mit benutzerdefinierten Indexnamen, die mit der USING-Klausel angegeben wurden.
    CREATE TABLE PROJECT (
        PROJ_ID    PROJNO NOT NULL,
        PROJ_NAME  VARCHAR(20) NOT NULL UNIQUE USING DESC INDEX IDX_PROJNAME,
        PROJ_DESC    BLOB SUB_TYPE 1,
        TEAM_LEADER  EMPNO,
        PRODUCT      PRODTYPE,
        CONSTRAINT PK_PROJECT PRIMARY KEY (PROJ_ID) USING INDEX IDX_PROJ_ID,
        FOREIGN KEY (TEAM_LEADER) REFERENCES EMPLOYEE (EMP_NO)
          USING INDEX IDX_LEADER
    );
                
  5. Erstellen der Tabelle SALARY_HISTORY mit zwei berechneten Feldern. Der erste wird gemäß dem Standard SQL:2003 deklariert, während der zweite gemäß der traditionellen Deklaration der berechneten Felder in Firebird deklariert wird.
    CREATE TABLE SALARY_HISTORY (
        EMP_NO          EMPNO NOT NULL,
        CHANGE_DATE     TIMESTAMP DEFAULT 'NOW' NOT NULL,
        UPDATER_ID      VARCHAR(20) NOT NULL,
        OLD_SALARY      SALARY NOT NULL,
        PERCENT_CHANGE  DOUBLE PRECISION DEFAULT 0 NOT NULL,
        SALARY_CHANGE   GENERATED ALWAYS AS
          (OLD_SALARY * PERCENT_CHANGE / 100),
        NEW_SALARY      COMPUTED BY
          (OLD_SALARY + OLD_SALARY * PERCENT_CHANGE / 100)
    );
                
  6. Erstellen einer verbindungsabhängigen Global Temporary Table.
    CREATE GLOBAL TEMPORARY TABLE MYCONNGTT (
        ID INTEGER NOT NULL PRIMARY KEY,
        TXT VARCHAR(32),
        TS TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
    ON COMMIT PRESERVE ROWS;
                
  7. Erstellen einer transaktionsbezogenen globalen temporären Tabelle, die einen Fremdschlüssel verwendet, um auf eine globale globale temporäre Tabelle mit Verbindungsbereich zu verweisen. Die ON COMMIT-Unterklausel ist optional, da DELETE ROWS die Standardeinstellung ist.
    CREATE GLOBAL TEMPORARY TABLE MYTXGTT (
        ID INTEGER NOT NULL PRIMARY KEY,
        PARENT_ID INTEGER NOT NULL REFERENCES MYCONNGTT(ID),
        TXT VARCHAR(32),
        TS TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
          ON COMMIT DELETE ROWS;
                

ALTER TABLE

Benutzt für: Ändern der Tabellenstruktur.

Verfügbar in: DSQL, ESQL

Syntax: 

ALTER TABLE tablename
<operation> [, <operation> ...]

<operation> ::= ADD <col_def>
                      ADD <tconstraint>
                      DROP colname
                      DROP CONSTRAINT constr_name
                      ALTER [COLUMN] colname <col_mod>

<col_def> ::= <regular_col_def> | <computed_col_def>

<regular_col_def> ::=
  colname {<datatype> | domainname}
  [DEFAULT {literal | NULL | <context_var>}]
  [NOT NULL]
  [<col_constraint>]
  [COLLATE collation_name]

<computed_col_def> ::=
  colname [<datatype>]
  {COMPUTED [BY] | GENERATED ALWAYS AS} (<expression>)

<col_mod> ::= <regular_col_mod> | <computed_col_mod>

<regular_col_mod> ::=
    TO newname
  | POSITION newpos
  | TYPE {<datatype> | domainname}
  | SET DEFAULT {literal | NULL | <context_var>}
  | DROP DEFAULT

<computed_col_mod> ::=
    TO newname
  | POSITION newpos
  | [TYPE <datatype>] {COMPUTED [BY] | GENERATED ALWAYS AS} (<expression>)

<datatype> ::=
    {SMALLINT | INTEGER | BIGINT} [<array_dim>]
  | {FLOAT | DOUBLE PRECISION} [<array_dim>]
  | {DATE | TIME | TIMESTAMP} [<array_dim>]
  | {DECIMAL | NUMERIC} [(precision [, scale])] [<array_dim>]
  | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
    [<array_dim>] [CHARACTER SET charset_name]
  | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING]
    [(size)] [<array_dim>]
  | BLOB [SUB_TYPE {subtype_num | subtype_name}]
    [SEGMENT SIZE seglen] [CHARACTER SET charset_name]
  | BLOB [(seglen [, subtype_num])]

<array_dim> ::= [[m]:n [,[m]:n ...]]

<col_constraint> ::=
  [CONSTRAINT constr_name]
  {   PRIMARY KEY [<using_index>]
    | UNIQUE      [<using_index>]
    | REFERENCES other_table [(colname)] [<using_index>]
        [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
        [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
    | CHECK (<check_condition>) }

<tconstraint> ::=
  [CONSTRAINT constr_name]
  {   PRIMARY KEY (col_list) [<using_index>]
    | UNIQUE      (col_list) [<using_index>]
    | FOREIGN KEY (col_list)
        REFERENCES other_table [(col_list)] [<using_index>]
        [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
        [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
    | CHECK (<check_condition>) }

<col_list> ::= colname [, colname ...]

<using_index> ::= USING
[ASC[ENDING] | DESC[ENDING]] INDEX indexname

<check_condition> ::=
    <val> <operator> <val>
  | <val> [NOT] BETWEEN <val> AND <val>
  | <val> [NOT] IN (<val> [, <val> ...] | <select_list>)
  | <val> IS [NOT] NULL
  | <val> IS [NOT] DISTINCT FROM <val>
  | <val> [NOT] CONTAINING <val>
  | <val> [NOT] STARTING [WITH] <val>
  | <val> [NOT] LIKE <val> [ESCAPE <val>]
  | <val> [NOT] SIMILAR TO <val> [ESCAPE <val>]
  | <val> <operator> {ALL | SOME | ANY} (<select_list>)
  | [NOT] EXISTS (<select_expr>)
  | [NOT] SINGULAR (<select_expr>)
  | (<search_condition>)
  | NOT <search_condition>
  | <search_condition> OR <search_condition>
  | <search_condition> AND <search_condition>

<operator> ::= 
  <> | != | ^= | ~= | = | < | > | <= | >= | !< | ^< | ~< | !> | ^> | ~>

<val> ::=
    colname [[<array_idx> [, <array_idx> ...]]]
  | literal
  | <context_var>
  | <expression>
  | NULL
  | NEXT VALUE FOR genname
  | GEN_ID(genname, <val>)
  | CAST(<val> AS <datatype>)
  | (<select_one>)
  | func([<val> [, <val> ...]])
        

Tabelle 5.8. ALTER TABLE Statement-Parameter

Parameter Beschreibung
tablename Name (Kennung) für die Tabelle. Sie kann aus bis zu 31 Zeichen bestehen und in der Datenbank eindeutig sein.
operation Eine der verfügbaren Operationen, die die Struktur der Tabelle verändert
colname Name (Bezeichner) für eine Spalte in der Tabelle, max. 31 Zeichen. Muss in der Tabelle eindeutig sein.
newname Neuer Name (Bezeichner) für die Spalte, max. 31 Zeichen. Muss in der Tabelle eindeutig sein.
newpos Die neue Spaltenposition (eine Ganzzahl zwischen 1 und der Anzahl der Spalten in der Tabelle)
col_constraint Spalten-Constraint
tconstraint Tabellen-Constraint
constr_name Der Name (Bezeichner) einer Einschränkung. Darf aus bis zu 31 Zeichen bestehen.
other_table Der Name der Tabelle, auf die die Constraint verweist
literal Ein Literalwert, der im angegebenen Kontext zulässig ist
context_var Beliebige Kontextvariable, deren Datentyp im angegebenen Kontext zulässig ist
check_condition Die Bedingung, die auf eine CHECK-Einschränkung angewendet wird, die als wahr, false oder NULL aufgelöst wird.
collation Collation
array_dim Array-Dimensionen
m, n INTEGER-Ganzzahlen die den Bereich der Array-Dimensionen angeben
precision Die Gesamtzahl der signifikanten Ziffern, die ein Wert des Datentyps halten kann (1..18)
scale Die Anzahl Stellen nach dem Dezimalkomma (0..precision)
size Die maximale Größe eines Strings in Zeichen
charset_name Der Name eines gültigen Zeichensatzes, falls der Zeichensatz der Spalte vom Standardzeichensatz der Datenbank abweichen soll
subtype_num BLOB-Subtype-Nummer
subtype_name BLOB-Subtyp-Mnemonikname
seglen Segmentgröße (max. 65535)
select_one Eine skalare SELECT-Anweisung — auswählen einer Spalte und zurückgeben nur einer Zeile
select_list Eine SELECT-Anweisung, die eine Spalte auswählt und null oder mehr Zeilen zurückgibt
select_expr Eine SELECT-Anweisung, die eine oder mehrere Spalten auswählt und null oder mehr Zeilen zurückgibt
expression Ein Ausdruck, der auf einen Wert auflöst, der im angegebenen Kontext zulässig ist
genname Sequenzname (Generatorname)
func Interne Funktion oder UDF


Die ALTER TABLE-Anweisung ändert die Struktur einer vorhandenen Tabelle. Mit einer Anweisung ALTER TABLE können Sie mehrere Operationen ausführen, Spalten und Einschränkungen hinzufügen und löschen sowie Spaltenangaben ändern.

Mehrere Operationen in einer Anweisung ALTER TABLE werden durch Kommata getrennt.

Zählung von Versionsinkrementen

Einige Änderungen in der Struktur einer Tabelle erhöhen den Metadatenänderungszähler („Versionszähler“), der jeder Tabelle zugewiesen ist. Die Anzahl der Metadatenänderungen ist für jede Tabelle auf 255 beschränkt. Sobald der Zähler die Grenze von 255 erreicht hat, können Sie keine weiteren Änderungen an der Struktur der Tabelle vornehmen, ohne den Zähler zurückzusetzen.

So setzen Sie den Metadaten-Änderungszähler zurück:  Sie sollten die Datenbank mithilfe des Dienstprogramms gbak sichern und wiederherstellen.

Die ADD-Klausel

Mit der ADD-Klausel können Sie eine neue Spalte oder eine neue Tabellenbeschränkung hinzufügen. Die Syntax zum Definieren der Spalte und die Syntax zum Definieren der Tabellenbeschränkung entsprechen denen, die für die Anweisung CREATE TABLE beschrieben wurden.

Auswirkung auf die Versionszählung: 

  • Jedes Mal, wenn eine neue Spalte hinzugefügt wird, wächst der Metadatenänderungszähler um eins
  • Das Hinzufügen einer neuen Tabellenbeschränkung erhöht den Metadatenänderungszähler nicht

Zu beachtende Punkte

  1. Seien Sie vorsichtig beim Hinzufügen einer neuen Spalte mit der Einschränkungsgruppe NOT NULL. Es kann dazu führen, dass die logische Integrität von Daten beeinträchtigt wird, wenn Sie in einer Spalte, die nicht auf Null gesetzt werden kann, Datensätze mit NULL haben. Beim Hinzufügen einer nicht-nullbaren Spalte wird empfohlen, entweder einen Standardwert dafür festzulegen oder die Spalte in vorhandenen Zeilen mit einem anderen Wert als Null zu aktualisieren.

  2. Wenn eine neue CHECK-Beschränkung hinzugefügt wird, werden vorhandene Daten nicht auf Übereinstimmung geprüft. Es wird empfohlen, vorhandene Daten mit dem neuen CHECK-Ausdruck zu testen.

Die DROP-Klausel

Die Klausel DROP < Spaltenname > löscht die angegebene Spalte aus der Tabelle. Ein Versuch, eine Spalte zu löschen, schlägt fehl, wenn irgendetwas darauf verweist. Betrachten Sie die folgenden Elemente als Quellen potenzieller Abhängigkeiten:

  • Spalten- oder Tabellenbeschränkungen
  • Indizes
  • Stored Procedures und Trigger
  • Ansichten (Views)

Auswirkung auf Versionszählung:  Jedes Mal, wenn eine Spalte gelöscht wird, wird der Metadatenänderungszähler der Tabelle um eins erhöht.

Die DROP CONSTRAINT-Klausel

Die DROP CONSTRAINT-Klausel löscht die angegebene Spalten- oder Tabellenebenenbeschränkung.

Eine PRIMARY KEY- oder UNIQUE-Beschränkung kann nicht gelöscht werden, wenn sie in einer anderen Tabelle durch eine FOREIGN KEY-Constraint referenziert wird. Es ist notwendig, die FOREIGN KEY-Beschränkung zu löschen, bevor Sie versuchen, die hierauf verweisenden PRIMARY KEY-Constraints oder UNIQUE-Constraints zu löschen.

Auswirkung auf Versionszähler:  Das Löschen einer Spaltenbeschränkung oder einer Tabellenbeschränkung erhöht den Metadatenänderungszähler nicht.

Die ALTER [COLUMN]-Klausel

Mit der ALTER [COLUMN]-Klausel können Attribute bestehender Spalten geändert werden, ohne dass die Spalte gelöscht oder neu hinzugefügt werden muss. Erlaubte Änderungen sind:

  • Ändern des Namens (wirkt sich nicht auf den Metadatenversionszähler aus)
  • Ändern des Datentyps (erhöht den Metadatenversionszähler um eins)
  • Ändern der Spaltenposition in der Spaltenliste der Tabelle (wirkt sich nicht auf den Metadatenversionszähler aus)
  • Löschen des Standardspaltenwert (wirkt sich nicht auf den Metadatenversionszähler aus)
  • Festlegen des Standardspaltenwertes oder den vorhandenen Standardwert ändern (hat keinen Einfluss auf den Metadatenversionszähler)
  • Ändern des Typs und des Ausdrucks für eine berechnete Spalte (wirkt sich nicht auf den Metadatenversionszähler aus)

Umbenennen einer Spalte: das TO-Schlüsselwort

Das TO-Schlüsselwort mit einer neuen Kennung benennt eine vorhandene Spalte um. Die Tabelle darf keine existierende Spalte haben, die den gleichen Bezeichner hat.

Es ist nicht möglich, den Namen einer Spalte zu ändern, die in einer Einschränkung enthalten ist: PRIMARY KEY, UNIQUE-Schlüssel, FOREIGN KEY, Spaltenbeschränkung oder der CHECK-Constraint einer Tabelle.

Das Umbenennen einer Spalte ist ebenfalls nicht zulässig, wenn die Spalte in einem Trigger, einer gespeicherten Prozedur oder einer Ansicht (View) verwendet wird.

Ändern des Datentyps einer Spalte: Das TYPE-Schlüsselwort

Das Schlüsselwort TYPE ändert den Datentyp einer vorhandenen Spalte in einen anderen, zulässigen Typ. Eine Typänderung, die zu einem Datenverlust führen kann, wird nicht zugelassen. Beispielsweise kann die Anzahl der Zeichen im neuen Typ für eine CHAR- oder VARCHAR-Spalte nicht kleiner sein als die bestehende Spezifikation dafür.

Wenn die Spalte als Array deklariert wurde, ist keine Änderung des Typs oder der Anzahl der Dimensionen zulässig.

Der Datentyp einer Spalte, die an einem Fremdschlüssel, einem Primärschlüssel oder einer eindeutigen Einschränkung beteiligt ist, kann überhaupt nicht geändert werden.

Ändern der Position einer Spalte: Das POSITION-Schlüsselwort

Das POSITION-Schlüsselwort ändert die Position einer vorhandenen Spalte im fiktiven „von links nach rechts“-Layout des Datensatzes.

Die Nummerierung der Spaltenpositionen beginnt bei 1.

  • Wenn eine Position kleiner als 1 angegeben ist, wird eine Fehlermeldung zurückgegeben
  • Wenn eine Positionsnummer größer als die Anzahl der Spalten in der Tabelle ist, wird die neue Position automatisch an die Anzahl der Spalten angepasst.

Die DROP DEFAULT- und SET DEFAULT-Klauseln

Die optionale DROP DEFAULT-Klausel löscht den Standardwert für die Spalte, wenn sie zuvor durch eine CREATE TABLE- oder ALTER TABLE-Anweisung dort gesetzt wurde.

  • Wenn die Spalte auf einer Domäne mit einem Standardwert basiert, wird der Standardwert auf die Standarddomain zurückgesetzt
  • Ein Ausführungsfehler wird ausgelöst, wenn versucht wird, den Standardwert einer Spalte zu löschen, die keinen Standardwert hat oder deren Standardwert Domain-basiert ist

Die optionale SET DEFAULT-Klausel setzt einen Standardwert für die Spalte. Wenn die Spalte bereits einen Standardwert hat, wird sie durch die neue ersetzt. Der Standardwert, der auf eine Spalte angewendet wird, überschreibt immer einen von einer Domain geerbten Wert.

Die COMPUTED [BY]- oder GENERATED ALWAYS AS-Klauseln

Der Datentyp und der Ausdruck, die einer berechneten Spalte zugrunde liegen, können mit der ALTER TABLE ALTER [COLUMN]-Anweisung angepasst werden. Die Umwandlung einer regulären Spalte in eine berechnete und umgekehrt ist nicht zulässig.

Attribute, die nicht geändert werden können

Folgende Änderungen werden nicht unterstützt:

  • Aktivieren oder Deaktivieren der Einschränkung NOT NULL für eine Spalte
  • Ändern der Standardkollation für eine Zeichentypspalte

Nur der Tabelleneigentümer und Administratoren haben die Berechtigung für ALTER TABLE.

Beispiele für die Verwendung von ALTER TABLE

  1. Hinzufügen der Spalte CAPITAL zur Tabelle COUNTRY.
    ALTER TABLE COUNTRY
    ADD CAPITAL VARCHAR(25);
                
  2. Hinzufügen der CAPITAL-Spalte mit der UNIQUE-Einschränkung und Löschen der CURRENCY-Spalte.
    ALTER TABLE COUNTRY
      ADD CAPITAL VARCHAR(25) NOT NULL UNIQUE,
      DROP CURRENCY;
                
  3. Hinzufügen der CHK_SALARY-Prüfbedingung und eines Fremdschlüssels zur JOB-Tabelle.
    ALTER TABLE JOB
    ADD CONSTRAINT CHK_SALARY CHECK (MIN_SALARY < MAX_SALARY),
    ADD FOREIGN KEY (JOB_COUNTRY) REFERENCES COUNTRY (COUNTRY);
                
  4. Festlegen des Standardwerts für das Feld MODEL, Ändern des Typs der ITEMID-Spalte und umbenennen der Spalte MODELNAME.
    ALTER TABLE STOCK
    ALTER COLUMN MODEL SET DEFAULT 1,
    ALTER COLUMN ITEMID TYPE BIGINT,
    ALTER COLUMN MODELNAME TO NAME;
                
  5. Ändern der berechneten Spalten NEW_SALARY und SALARY_CHANGE.
    ALTER TABLE SALARY_HISTORY
    ALTER NEW_SALARY GENERATED ALWAYS AS 
      (OLD_SALARY + OLD_SALARY * PERCENT_CHANGE / 100),
    ALTER SALARY_CHANGE COMPUTED BY 
      (OLD_SALARY * PERCENT_CHANGE / 100);
                

Siehe auch:  CREATE TABLE, DROP TABLE, CREATE DOMAIN

DROP TABLE

Benutzt für: Löschen einer Tabelle

Verfügbar in: DSQL, ESQL

Syntax: 

drop table tablename;
        

Tabelle 5.9. DROP TABLE Statement-Parameter

Parameter Beschreibung
tablename Name (Kennung) der Tabelle


Die Anweisung DROP TABLE löscht eine vorhandene Tabelle. Wenn die Tabelle Abhängigkeiten hat, schlägt die Anweisung DROP TABLE mit einem Ausführungsfehler fehl.

Wenn eine Tabelle gelöscht wird, werden auch alle Trigger für ihre Ereignisse und Indizes, die für ihre Felder erstellt wurden, gelöscht.

Nur der Tabelleneigentümer und Administratoren haben die Berechtigung, DROP TABLE zu verwenden.

Beispiel: Die Tabelle COUNTRY löschen.

DROP TABLE COUNTRY;
          

Siehe auch:  CREATE TABLE, ALTER TABLE, RECREATE TABLE

RECREATE TABLE

Benutzt für: Erstellen einer neuen Tabelle (Relation) oder Wiederherstellen einer bestehenden

Verfügbar in: DSQL

Syntax: 

RECREATE [GLOBAL TEMPORARY] TABLE tablename
  [EXTERNAL [FILE] '<filespec>']
  (<col_def> [, {<col_def> | <tconstraint>} ...])
  [ON COMMIT {DELETE | PRESERVE} ROWS]
        

Vergleichen Sie den CREATE TABLE- Abschnitt für die vollständige Syntax für CREATE TABLE und beachten Sie die Beschreibungen zum Definieren von Tabellen, Spalten und Constraints.

RECREATE TABLE erstellt eine Tabelle neu oder erneut. Wenn bereits eine Tabelle mit diesem Namen vorhanden ist, versucht die Anweisung RECREATE TABLE, diese zu löschen und eine neue zu erstellen. Bestehende Abhängigkeiten verhindern die Ausführung der Anweisung.

Beispiel:  Erstellen oder Wiederherstellen der Tabelle COUNTRY.

RECREATE TABLE COUNTRY (
  COUNTRY COUNTRYNAME NOT NULL PRIMARY KEY,
  CURRENCY VARCHAR(10) NOT NULL);
          

Siehe auch:  CREATE TABLE, DROP TABLE

Zurück: DOMAINFirebird Documentation IndexNach oben: Statements der Data Definition (DDL)Weiter: INDEX
Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Definition (DDL) → TABLE