Insert (SQL)

Aus MARJORIE-WIKI
Wechseln zu: Navigation, Suche

Eine SQL INSERT-Anweisung fügt einen oder mehrere Datensätze zu einer einzigen Tabelle in einer Relationalen Datenbank hinzu.

Einführung[Bearbeiten]

Insert-Anweisungen haben den folgenden Aufbau:

  • INSERT INTO Tabelle (Spalte1, [Spalte2, ... ]) VALUES (Wert1, [Wert2, ...])

Die Anzahl der Spalten und Werte muss übereinstimmen. Wird eine Spalte nicht angegeben, wird der Standardwert für diese Spalte verwendet. Die übergebenen (oder angenommenen) Werte der INSERT-Anweisung müssen alle Vorschriften und Bedingungen wie Primärschlüssel, CHECK-Bedingungen, und NOT NULL erfüllen). Wenn ein Syntaxfehler auftritt oder eine Bedingung verletzt wird, so wird die neue Zeile nicht zur Tabelle hinzugefügt und man erhält stattdessen eine Fehlermeldung.

Beispiel:

INSERT INTO Telefonbuch (Name, Telefonnummer) VALUES ('Martin Muster', '000-11223344');

Kurzformen können auch verwendet werden, wenn man die Reihenfolge der Spalten beachtet, welche bei der Tabellenerstellung festgelegt wurde. Es müssen nicht alle Spalten angegeben werden, da nicht verwendete Spalten mit ihrem Standardwert gefüllt werden oder auf NULL bleiben:

  • INSERT INTO Tabelle VALUES (Wert1, [Wert2, ...])

Ein Beispiel, um zwei Spalten in der Telefonbuch-Tabelle einzufügen und die anderen Spalten, welche anschließend folgen könnten, zu ignorieren:

INSERT INTO Telefonbuch VALUES ('Martin Muster', '000-11223344');

Erweiterte Anweisungen[Bearbeiten]

Inserts mehrerer Zeilen[Bearbeiten]

Seit SQL-92 gibt es die Möglichkeit Spaltenwert-Konstruktoren zu verwenden, um mehrere Zeilen gleichzeitig mit einer Anweisung einzufügen:

INSERT INTO ''Tabelle'' (''Spalte-a'', [''Spalte-b, ... ''])
VALUES (''Wert-1a'', [''Wert-1b, ...'']),
       (''Wert-2a'', [''Wert-2b, ...'']),
       ...

Diese Möglichkeit wird unterstützt von DB2, SQL Server (seit Version 10.0 - etwa 2008), PostgreSQL (seit Version 8.2), MySQL, und H2.

Beispiel (Annahme, dass 'Name' and 'Telefonnummer' die einzigen Spalten in der 'Telefonbuch' Tabelle sind):

INSERT INTO Telefonbuch VALUES ('Martin Muster', '000-11223344'), ('Markus Mustermann', '111-00226644');

Dies ist eine Abkürzung der folgenden zwei Befehle:

INSERT INTO Telefonbuch VALUES ('Martin Muster', '000-11223344');
INSERT INTO Telefonbuch VALUES ('Markus Mustermann', '111-00226644');

Es muss beachtet werden, dass die zwei einzelnen Anweisungen einen etwas unterschiedlichen Aufbau habe können (speziell in Verbindung mit Triggern) und dass sie nicht den gleichen Durchsatz haben können wie eine einzelne Anweisung für mehrere Zeilen.

Um mehrere Zeilen in MS SQL einzugeben, kann man folgende Anweisung verwenden:

INSERT INTO Telefonbuch
SELECT 'Martin Muster', '000-11223344'
UNION ALL
SELECT 'Markus Mustermann', '111-00226644';

Achtung, dies ist keine gültige SQL-Anweisung laut SQL-Standard (SQL:2003), da der Subselect unvollständig ist.

Um das Gleiche in Oracle zu erreichen, kann DUAL table verwendet werden, welche immer aus einer einzigen Zeile gebildet wird:

INSERT INTO Telefonbuch
SELECT 'Martin Muster', '000-11223344' FROM DUAL
UNION ALL
SELECT 'Markus Mustermann', '111-00226644' FROM DUAL

Eine standardkonforme Implementation dieser Logik zeigt das nachfolgende Beispiel:

INSERT INTO Telefonbuch
SELECT 'Martin Muster', '000-11223344' FROM LATERAL (VALUES (1)) AS t(c)
UNION ALL
SELECT 'Markus Mustermann','111-00226644' FROM LATERAL (VALUES (1)) AS t(c)

Oracle PL/SQL unterstützt die "INSERT ALL"-Anweisung, bei der mehrere Insert-Anweisungen durch ein SELECT beendet werden:Oracle PL/SQL: INSERT ALL. In: psoug.org. Abgerufen am 2. September 2010.

INSERT ALL
INTO Telefonbuch VALUES ('Martin Muster', '000-11223344')
INTO Telefonbuch VALUES ('Markus Mustermann', '111-00226644')
SELECT * FROM DUAL;

Zeilen von anderen Tabellen kopieren[Bearbeiten]

Eine INSERT-Anweisung kann auch verwendet werden, um Daten von anderen zu erhalten, diese anzupassen und anschließend direkt in die Tabelle einzufügen. Dies geschieht in einer einzigen SQL-Anweisung. Es wird ein Subselect an Stelle des VALUES-Abschnittes verwendet. Das Subselect kann Joins, Funktionsaufrufe und sogar Abfragen in die gleiche Tabelle, in die eingefügt wird, enthalten. Beispiel:

INSERT INTO Telefonbuch2
SELECT *
FROM   Telefonbuch
WHERE  Name IN ('Martin Muster', 'Markus Mustermann')

Wenn man nicht den gesamten Datensatz in die neue Tabelle einfügen möchte, muss die Anweisung etwas angepasst werden. Dies auch, wenn die Schemas der Tabellen nicht übereinstimmen.

INSERT INTO Telefonbuch2 ([Name], [Telefonnummer])
SELECT [Name], [Telefonnummer]
FROM   Telefonbuch
WHERE  Name IN ('Martin Muster', 'Markus Mustermann')

Die SELECT-Anweisung generiert eine (temporäre) Tabelle. Das Schema dieser temporären Tablle muss mit dem Schema übereinstimmen, in welches die Daten eingefügt werden.

Den (Primär)schlüssel herausfinden[Bearbeiten]

Datenbank-Designer, welche einen Fremdschlüssel als Primärschlüssel in einer Tabelle verwenden, werden in die Situation kommen, dass sie den generierten Schlüssel des INSERT Befehls in anderen Anweisungen verwenden müssen. Die meisten Systeme erlauben es aber nicht, dass die INSERT Anweisung Daten zurückliefert. In diesen Fällen müssen nachfolgende Workarounds verwendet werden. Die meisten Programme unterstützen folgendes:

  • Verwenden einer datenbankspezifischen gespeicherten Prozedur, welche den Fremdschlüssel generiert, die INSERT Operation durchführt und anschließend den generierten Schlüssel zurückliefert. Als Beispiel erhält man den Schlüssel im Microsoft SQL Server mit der SCOPE_IDENTITY() Spezialfunktion, während in SQLite die Funktion last_insert_rowid() heißt.
  • Verwenden einer datenbankspezifischen SELECT Anweisung auf eine temporäre Tabelle, welche die zuletzt eingefügten Zeilen enthält. DB2 implementiert dieses Feature folgendermaßen:
SELECT *
FROM NEW TABLE (INSERT INTO Telefonbuch VALUES ('Martin Muster','000-11223344')) AS t
DB2 für z/OS implementiert dieses Feature folgendermaßen:
SELECT EMPNO, HIRETYPE, HIREDATE
FROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY, DEPTNO, LEVEL) VALUES(Mary Smith, 35000.00, 11, Associate));
  • Verwendung einer SELECT-Anweisung nach dem INSERT Befehl mit einer datenbankspezifischen Funktion, welche den zuletzt generierten Primärschlüssel zurückgibt.
  • Verwendung eine einmaligen Kombination von Elementen der Original SQL INSERT-Anweisung in einer SELECT Unteranweisung.
  • Verwendung einer GUID im INSERT-Befehl und dem Zurücklesen in einem SELECT Befehl.
  • Verwendung einer OUTPUT-Anweisung im INSERT-Befehl für den MS SQL Server 2005 and MS SQL SERVER 2008.
  • Verwendung eines INSERT gefolgt von einer SELECT LAST_INSERT_ID() für MySQL.
  • Verwendung einer INSERT-Anweisung mit einer RETURNING Anweisung für Oracle.
INSERT INTO Telefonbuch VALUES ('Martin Muster','000-11223344')
RETURNING phone_book_id INTO v_pb_id
  • Verwendung eines INSERT-Befehls mit der RETURNING-Anweisung für PostgreSQL (seit 8.2). Die zurückgegebene Liste ist identisch mit dem Resultat von SELECT.
INSERT INTO Telefonbuch VALUES ('Martin Muster','000-11223344')
RETURNING TelefonbuchID
  • Verwendung der IDENTITY() Funktion in H2 gibt die zuletzt eingefügte Identität zurück.
SELECT IDENTITY();

Trigger[Bearbeiten]

Wenn Trigger für die Tabelle definiert sind, mit welcher die INSERT-Anweisung arbeitet, werden diese im Zusammenhang mit der Operation ausgewertet. BEFORE INSERT Triggers erlauben eine Veränderung der Werte, welche in die Tabelle eingefügt werden sollen. AFTER INSERT Triggers können die Daten nicht mehr anpassen, doch sie können verwendet werden, um Anpassungen an anderen Tabellen durchzuführen, wie etwa einen Prüfmechanismus.

Siehe auch[Bearbeiten]

Weblinks[Bearbeiten]


Wikilinks - Wikis & Websites mit Artikeln zum Thema[Bearbeiten]

(Trage deinen Link zum Artikel ein, wenn du eine Seite zum Thema oder diesen Artikel in dein Wiki exportiert hast)

Social Networks[Bearbeiten]

Netzwerke[Bearbeiten]

Blogs[Bearbeiten]

Twitter[Bearbeiten]


Info Sign.svg Dieser Wikipedia-Artikel wurde, gemäß GFDL, CC-by-sa mit der kompletten History importiert.