Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Manipulation Language (DML) → INSERT
Firebird Home Firebird Home Zurück: SELECTFirebird Documentation IndexNach oben: Statements der Data Manipulation Language (DML)Weiter: UPDATE

INSERT

Inhaltsverzeichnis

INSERT ... VALUES
INSERT ... SELECT
INSERT ... DEFAULT VALUES
Die RETURNING-Klausel
Einfügen in BLOB-Spalten

Verwendet für:  Einfügen von Datenzeilen in eine Tabelle

Verfügbar in: DSQL, ESQL, PSQL

Syntax: 

INSERT INTO target
{DEFAULT VALUES | [(<column_list>)] <value_source>}
[RETURNING <returning_list> [INTO <variables>]]

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

<value_source> ::= VALUES (<value_list>) | <select_stmt>

<value_list> ::= value [, value ...]

<returning_list> ::= ret_value [, ret_value ...]
<variables> ::= [:]varname [, [:]varname ...]

Tabelle 6.11. Argumente für die Parameter des INSERT-Statements

Argument Beschreibung
target Der Name der Tabelle oder Sicht, zu der eine neue Zeile oder ein Stapel von Zeilen hinzugefügt werden soll
colname Spalte in der Tabelle oder in der Ansicht
value Ein Ausdruck, dessen Wert zum Einfügen in die Tabelle verwendet wird
ret_value Der Ausdruck, der in der RETURNING-Klausel zurückgegeben werden soll
varname Name einer lokalen PSQL-Variablen


Beschreibung: Das INSERT-Statement wird verwendet um Zeilen zu einer Tabelle hinzuzufügen. Alternativ können Zeilen auch in eine oder mehrere Tabellen eingefügt werden, die als Basis für eine View dienen:

Beschränkungen

  • Für Spalten, die an die NEW.column_list-Kontextvariablen in Triggern zurückgegeben werden, darf kein Doppelpunkt („ :“) vorangestellt sein

  • Keine Spalte darf mehr als einmal in der Spaltenliste vorkommen.

ACHTUNG :: 'BEFORE INSERT'-Trigger

Berücksichtigen Sie unabhängig von der zum Einfügen von Zeilen verwendeten Methode alle Spalten in der Zieltabelle oder -sicht, die von BEFORE INSERT-Triggern gefüllt werden, z. B. Primärschlüssel und Suchfelder ohne Beachtung der Groß- / Kleinschreibung. Diese Spalten sollten sowohl von der column_list als auch von der VALUES-Liste ausgeschlossen werden, wenn die Trigger die NEW.column_name auf NULL prüfen.

INSERT ... VALUES

Die VALUES-Liste muss für jede Spalte in der Spaltenliste einen Wert in derselben Reihenfolge und mit dem richtigen Typ angeben. Die Spaltenliste muss nicht jede Spalte im Ziel angeben, aber wenn die Spaltenliste nicht vorhanden ist, benötigt die Engine für jede Spalte in der Tabelle oder Ansicht einen Wert (berechnete Spalten ausgeschlossen).

Anmerkung

Introducer-Syntax bietet eine Möglichkeit, den Zeichensatz eines Werts zu identifizieren, der eine Zeichenfolgenkonstante (Literal) ist. Die Introducer-Syntax funktioniert nur mit Literalstrings: Sie kann nicht auf Stringvariablen, Parameter, Spaltenreferenzen oder Werte, die Ausdrücke sind, angewendet werden.

Beispiele: 

INSERT INTO cars (make, model, year)
VALUES ('Ford', 'T', 1908);

INSERT INTO cars
VALUES ('Ford', 'T', 1908, 'USA', 850);

-- notice the '_' prefix (introducer syntax)
INSERT INTO People
VALUES (_ISO8859_1 'Hans-Jörg Schäfer')
          

INSERT ... SELECT

Für diese Einfügemethode müssen die Ausgabespalten der Anweisung SELECT für jede Zielspalte in der Spaltenliste einen Wert in derselben Reihenfolge und vom richtigen Typ bereitstellen.

Literale Werte, Kontextvariablen oder Ausdrücke des kompatiblen Typs können für jede Spalte in der Quellzeile verwendet werden. In diesem Fall sind eine Quellenspaltenliste und eine entsprechende VALUES-Liste erforderlich.

Wenn die Spaltenliste abwesend ist — wie es ist, wenn SELECT * für den Quellausdruck — verwendet wird, muss die column_list die Namen jeder Spalte in der Zieltabelle oder Sicht enthalten ( berechnete Spalten ausgeschlossen).

Beispiele: 

INSERT INTO cars (make, model, year)
  SELECT make, model, year
  FROM new_cars;

INSERT INTO cars
  SELECT * FROM new_cars;

INSERT INTO Members (number, name)
  SELECT number, name FROM NewMembers
    WHERE Accepted = 1
UNION ALL
  SELECT number, name FROM SuspendedMembers
    WHERE Vindicated = 1

INSERT INTO numbers(num)
  WITH RECURSIVE r(n) as (
      SELECT 1 FROM rdb$database
      UNION ALL
      SELECT n+1 FROM r WHERE n < 100
                          )
SELECT n FROM r
          

Natürlich müssen die Spaltennamen in der Quelltabelle nicht mit denen in der Zieltabelle übereinstimmen. Jede Art von SELECT-Anweisung ist zulässig, solange ihre Ausgabespalten exakt mit den Einfügespalten in Anzahl, Reihenfolge und Typ übereinstimmen. Typen müssen nicht exakt gleich sein, aber sie müssen zuweisungskompatibel sein.

Das Problem mit dem „instabilen Cursor

In Firebird muss bis zu dieser Version ein Implementierungsfehler geachtet werden, der diese Art von Einfügungen betrifft, wenn das Ziel darin besteht, Zeilen in derselben Tabelle zu duplizieren. Beispielsweise

INSERT INTO T
  SELECT * FROM T
          

liebevoll als die „unendliche Einfügeschleife“ bezeichnet, wählt fortlaufend Zeilen aus und fügt sie immer wieder ein, bis das System keinen Speicherplatz mehr hat.

Dies ist eine Eigenart, die alle datenverändernden DML-Operationen mit einer Vielzahl von Effekten beeinflusst. Dies geschieht, weil DML-Anweisungen in den Ausführungsebenen implizite Cursor zum Ausführen der Operationen verwenden. Mit unserem einfachen Beispiel funktioniert die Ausführung folgendermaßen:

FOR SELECT <values> FROM T INTO <tmp_vars>
  DO
    INSERT INTO T VALUES (<tmp_vars>)
          

Die Implementierung führt zu einem Verhalten, das nicht mit den SQL-Standards übereinstimmt. Zukünftige Versionen von Firebird werden dem Standard entsprechen.

INSERT ... DEFAULT VALUES

Die DEFAULT VALUES-Klausel erlaubt das Einfügen eines Datensatzes ohne die Angabe von Werten, weder direkt oder durch ein SELECT-Statement. Dies ist nur möglich, wenn jede NOT NULL- oder CHECK-basierte Spalte in der Tabelle entweder einen gültigen Standardwert deklariert hat oder die Werte über einen BEFORE INSERT-Trigger erhält. Darüber hinaus dürfen Trigger, die erforderliche Feldwerte bereitstellen, nicht von dem Vorhandensein von Eingabewerten abhängen.

Beispiel: 

INSERT INTO journal
  DEFAULT VALUES
RETURNING entry_id
          

Die RETURNING-Klausel

Eine INSERT-Anweisung, die höchstens eine Zeile hinzufügt, kann optional eine Klausel RETURNING enthalten, um Werte aus der eingefügten Zeile zurückzugeben. Die Klausel, falls vorhanden, muss nicht alle Einfügungsspalten enthalten und kann auch andere Spalten oder Ausdrücke enthalten. Die zurückgegebenen Werte spiegeln alle Änderungen wider, die möglicherweise in den BEFORE INSERT-Triggern vorgenommen wurden.

ACHTUNG :: Mehrfache INSERTs

In DSQL gibt eine Anweisung mit RETURNING immer nur eine Zeile zurück. Wenn die RETURNING-Klausel angegeben ist und mehr als eine Zeile von der INSERT-Anweisung eingefügt wird, schlägt die Anweisung fehl und eine Fehlermeldung wird zurückgegeben. Dieses Verhalten kann sich in zukünftigen Firebird-Versionen ändern.

Beispiele: 

INSERT INTO Scholars (
  firstname, 
  lastname,
  address,
  phone,
  email)
VALUES (
  'Henry',
  'Higgins',
  '27A Wimpole Street',
  '3231212',
  NULL)
RETURNING lastname, fullname, id;

INSERT INTO Dumbbells (firstname, lastname, iq)
  SELECT fname, lname, iq
FROM Friends
  ORDER BY iq ROWS 1
  RETURNING id, firstname, iq
INTO :id, :fname, :iq;
          

Hinweise: 

  • RETURNING wird nur unterstützt für VALUES-Inserts und Singleton- SELECT-Inserts.

  • In DSQL gibt eine Anweisung mit einer RETURNING-Klausel immer genau eine Zeile zurück. Wenn tatsächlich kein Datensatz eingefügt wurde, sind die Felder in dieser Zeile alle NULL. Dieses Verhalten kann sich in einer späteren Version von Firebird ändern. Wenn in PSQL keine Zeile eingefügt wurde, wird nichts zurückgegeben und die Zielvariablen behalten ihre vorhandenen Werte bei.

Einfügen in BLOB-Spalten

Das Einfügen in BLOB-Spalten ist nur unter folgenden Umständen möglich:

  1. Die Client-Anwendung hat mit der Firebird-API spezielle Vorkehrungen für solche Einsätze getroffen. In diesem Fall ist der modus operandi anwendungsspezifisch und außerhalb des Geltungsbereichs dieses Handbuchs.

  2. Der eingegebene Wert ist eine Textzeichenfolge von nicht mehr als 32767 Byte.

    Achtung

    Wenn der Wert kein String-Literal ist, achten Sie auf Verkettungen, da die Ausgabe des Ausdrucks die maximale Länge überschreiten kann.

  3. Sie nutzen die Form „INSERT ... SELECT“ und eine oder mehr Spalten im Rückgabesatz sind BLOBs.

Zurück: SELECTFirebird Documentation IndexNach oben: Statements der Data Manipulation Language (DML)Weiter: UPDATE
Firebird Documentation IndexFirebird 2.5 SprachreferenzStatements der Data Manipulation Language (DML) → INSERT