Insert (SQL)

Aus PlusPedia
Wechseln zu: Navigation, Suche

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

Coin Übrigens: Die PlusPedia ist NICHT die Wikipedia.
Wir sind ein gemeinnütziger Verein, PlusPedia ist werbefrei. Wir freuen uns daher über eine kleine Spende!

1 Einführung

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');

2 Erweiterte Anweisungen

2.1 Inserts mehrerer Zeilen

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 (

3 Andere Versionen

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. 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;

3.1 Zeilen von anderen Tabellen kopieren

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.

4 Den (Primär)schlüssel herausfinden

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();

5 Trigger

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.

6 Weblinks

(Seite nicht mehr abrufbar

7 Init-Quelle

Entnommen aus der:

Erster Autor: Snoopy78 angelegt am 28.02.2011 um 17:12,
Alle Autoren: Krd, Tz92, Xls, Invisigoth67, Michax1, Rita2008, Snoopy78


8 Andere Lexika

  • Dieser Artikel wurde in der Wikipedia gelöscht.



Diesen Artikel melden!
Verletzt dieser Artikel deine Urheber- oder Persönlichkeitsrechte?
Hast du einen Löschwunsch oder ein anderes Anliegen? Dann nutze bitte unser Kontaktformular

PlusPedia Impressum
Diese Seite mit Freunden teilen:
Mr Wong Digg Delicious Yiggit wikio Twitter
Facebook




Bitte Beachte:
Sämtliche Aussagen auf dieser Seite sind ohne Gewähr.
Für die Richtigkeit der Aussagen übernimmt die Betreiberin keine Verantwortung.
Nach Kenntnissnahme von Fehlern und Rechtsverstößens ist die Betreiberin selbstverständlich bereit,
diese zu beheben.

Verantwortlich für jede einzelne Aussage ist der jeweilige Erstautor dieser Aussage.
Mit dem Ergänzen und Weiterschreiben eines Artikels durch einen anderen Autor
werden die vorhergehenden Aussagen und Inhalte nicht zu eigenen.
Die Weiternutzung und Glaubhaftigkeit der Inhalte ist selbst gegenzurecherchieren.


Typo3 Besucherzähler - Seitwert blog counter
java hosting vpn norway