Einfügen (SQL)

Artikel bearbeiten

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

Inhalt

  • 1 Grundform
  • 2 Erweiterte Formulare
    • 2.1 Mehrreiheneinsätze
    • 2.2 Zeilen aus anderen Tabellen kopieren
    • 2.3 Standardwerte
  • 3 Schlüssel abrufen
  • 4 Auslöser
  • 5 Referenzen
  • 6 Externe Links

Grundform

Insert-Anweisungen haben die folgende Form:

 INSERT INTO- Tabelle ( Spalte1 [, Spalte2, Spalte3. ..]) VALUES ( Wert1 [, Wert2, Wert3. ..])

Die Anzahl der Spalten und Werte muss gleich sein.Wenn keine Spalte angegeben ist, wird der Standardwert für die Spalte verwendet.Die in der INSERT- Anweisungangegebenen (oder implizierten) Wertemüssen alle anwendbaren Einschränkungen erfüllen (z. B. Primärschlüssel, CHECK- Einschränkungen und NOT NULL- Einschränkungen).Wenn ein Syntaxfehler auftritt oder wenn Einschränkungen verletzt werden, wird die neue Zeile nicht zur Tabelle hinzugefügt und stattdessen ein Fehler zurückgegeben.

Beispiel:

INSERT INTO phone_book (name, number) VALUES ('John Doe', '555-1212');

Es kann auch eine Kurzform verwendet werden, wobei die Reihenfolge der Spalten beim Erstellen der Tabelle ausgenutzt wird.Es ist nicht erforderlich, alle Spalten in der Tabelle anzugeben, da alle anderen Spalten ihren Standardwert annehmen oder null bleiben:

 INSERT INTO table VALUES ( Wert1, [ Wert2,...])

Beispiel für das Einfügen von Daten in 2 Spalten in der Tabelle phone_book und das Ignorieren anderer Spalten, die möglicherweise nach den ersten 2 in der Tabelle stehen.

INSERT INTO phone_book VALUES ('John Doe', '555-1212');

Erweiterte Formulare

Mehrreiheneinsätze

Eine SQL-Funktion (seit SQL-92 ) ist die Verwendung von Zeilenwertkonstruktoren, um mehrere Zeilen gleichzeitig in eine einzelne SQL-Anweisung einzufügen:

INSERT INTO tablename (column-a, [column-b,...])VALUES ('value-1a', ['value-1b',...]),('value-2a', ['value-2b',...]),...

Diese Funktion wird von DB2, SQL Server (seit Version 10.0 - dh 2008), PostgreSQL (seit Version 8.2), MySQL, SQLite (seit Version 3.7.11) und H2 unterstützt.

Beispiel (unter der Annahme, dass 'Name' und 'Nummer' die einzigen Spalten in der Tabelle 'phone_book' sind):

INSERT INTO phone_book VALUES ('John Doe', '555-1212'), ('Peter Doe', '555-2323');

Dies kann als Abkürzung für die beiden Aussagen angesehen werden

INSERT INTO phone_book VALUES ('John Doe', '555-1212');INSERT INTO phone_book VALUES ('Peter Doe', '555-2323');

Man beachte,dass die beide getrennten Aussagen unterschiedliche Semantik haben können (insbesondere in Bezug auf Anweisung Trigger ) und die gleiche Leistung wie ein einzigen mehrreihigen Einsatz nicht bereitstellen können.

Um mehrere Zeilen in MS SQL einzufügen, können Sie eine solche Konstruktion verwenden:

INSERT INTO phone_bookSELECT 'John Doe', '555-1212'UNION ALLSELECT 'Peter Doe', '555-2323';

Beachten Sie, dass diesaufgrund der unvollständigen Subselect-Klauselkeine gültige SQL-Anweisung gemäß dem SQL-Standard ( SQL: 2003 ) ist.

Verwenden Sie dazu in Oracle die DUAL-Tabelle, die immer nur aus einer einzelnen Zeile besteht:

INSERT INTO phone_bookSELECT 'John Doe', '555-1212' FROM DUALUNION ALLSELECT 'Peter Doe','555-2323' FROM DUAL

Eine standardkonforme Implementierung dieser Logik zeigt das folgende Beispiel oder wie oben gezeigt:

INSERT INTO phone_bookSELECT 'John Doe', '555-1212' FROM LATERAL ( VALUES (1)) AS t(c)UNION ALLSELECT 'Peter Doe','555-2323' FROM LATERAL ( VALUES (1)) AS t(c)

Oracle PL / SQL unterstützt dieAnweisung INSERT ALL, bei der mehrere Einfügeanweisungen durch SELECT beendet werden:

INSERT ALLINTO phone_book VALUES ('John Doe', '555-1212')INTO phone_book VALUES ('Peter Doe', '555-2323')SELECT * FROM DUAL;

In Firebird können mehrere Zeilen wie folgt eingefügt werden:

INSERT INTO phone_book ("name", "number")SELECT 'John Doe', '555-1212' FROM RDB$DATABASEUNION ALLSELECT 'Peter Doe', '555-2323' FROM RDB$DATABASE;

Firebird beschränkt jedoch die Anzahl der Zeilen, die auf diese Weise eingefügt werden können, da die Anzahl der Kontexte, die in einer einzelnen Abfrage verwendet werden können, begrenzt ist.

Kopieren von Zeilen aus anderen Tabellen

Eine INSERT- Anweisung kann auch verwendet werden, um Daten aus anderen Tabellen abzurufen, bei Bedarf zu ändern und direkt in die Tabelle einzufügen.All dies erfolgt in einer einzigen SQL-Anweisung, die keine Zwischenverarbeitung in der Clientanwendung beinhaltet.Anstelle der VALUES- Klausel wird eine Unterauswahl verwendet.Die Unterauswahl kann Verknüpfungen und Funktionsaufrufe enthalten und sogar dieselbe Tabelle abfragen, in die die Daten eingefügt werden.Logischerweise wird die Auswahl ausgewertet, bevor der eigentliche Einfügevorgang gestartet wird.Ein Beispiel ist unten angegeben.

INSERT INTO phone_book2SELECT *FROMphone_bookWHEREname IN ('John Doe', 'Peter Doe')

Eine Variation ist erforderlich, wenn einige Daten aus der Quelltabelle in die neue Tabelle eingefügt werden, jedoch nicht der gesamte Datensatz.(Oder wenn die Schemata der Tabellennicht identisch sind.)

INSERT INTO phone_book2 ( [name], [phoneNumber])SELECT [name], [phoneNumber]FROMphone_bookWHEREname IN ('John Doe', 'Peter Doe')

Die SELECT- Anweisung erzeugt eine (temporäre) Tabelle, und das Schema dieser temporären Tabelle muss mit dem Schema der Tabelle übereinstimmen, in die die Daten eingefügt werden.

Standardwerte

Es ist möglich, eine neue Zeile ohne Angabe von Daten einzufügen, wobei Standardwerte für alle Spalten verwendet werden.Einige Datenbanken lehnen die Anweisung jedoch ab, wenn keine Daten angegeben sind, z. B. Microsoft SQL Server. In diesem Fall kann dasSchlüsselwort DEFAULT verwendet werden.

INSERT INTO phone_bookVALUES ( DEFAULT)

Manchmal unterstützen Datenbanken auch alternative Syntax dafür;Zum Beispiel ermöglicht dasWeglassen MySQL das DEFAULT Schlüsselwort und T-SQL verwenden kann STANDARDWERTE statt VALUES (STANDARD).DasSchlüsselwort DEFAULT kann auch beim normalen Einfügen verwendet werden, um eine Spalte explizit mit dem Standardwert dieser Spalte zu füllen:

INSERT INTO phone_book VALUES ( DEFAULT, '555-1212')

Was passiert, wenn eine Spalte keinen Standardwert angibt, ist datenbankabhängig.Beispielsweise füllen MySQL und SQLite einen leeren Wert aus (außer im strengen Modus), während viele andere Datenbanken die Anweisung ablehnen.

Schlüssel abrufen

Datenbankdesigner, die einen Ersatzschlüssel als Primärschlüssel für jede Tabelle verwenden, stoßen gelegentlich auf ein Szenario, in dem sie den datenbankgenerierten Primärschlüssel automatisch aus einer SQL INSERT- Anweisungabrufen müssen,um ihn in anderen SQL-Anweisungen zu verwenden.Die meisten Systeme erlauben SQL INSERT- Anweisungennicht, Zeilendaten zurückzugeben.Daher ist es erforderlich, in solchen Szenarien eine Problemumgehung zu implementieren.Zu den gängigen Implementierungen gehören:

  • Verwenden einer datenbankspezifischen gespeicherten Prozedur, die den Ersatzschlüssel generiert, die INSERT- Operationausführtund schließlich den generierten Schlüssel zurückgibt.In Microsoft SQL Server wird der Schlüssel beispielsweise über die Sonderfunktion SCOPE_IDENTITY () abgerufen, während in SQLite die Funktion last_insert_rowid () heißt.
  • Verwenden einer datenbankspezifischen SELECT- Anweisung für eine temporäre Tabelle mit den zuletzt eingefügten Zeilen.DB2 implementiert diese Funktion folgendermaßen:
    SELECT *FROM NEW TABLE (INSERT INTO phone_bookVALUES ( 'Peter Doe','555-2323')) AS t
    • DB2 für z / OS implementiert diese Funktion folgendermaßen.
      SELECT EMPNO, HIRETYPE, HIREDATEFROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY, DEPTNO, LEVEL)VALUES(’Mary Smith’, 35000.00, 11, ’Associate’));
  • Verwenden einer SELECT- Anweisung nach der INSERT- Anweisung mit einer datenbankspezifischen Funktion, die den generierten Primärschlüssel für die zuletzt eingefügte Zeile zurückgibt.Zum Beispiel LAST_INSERT_ID () für MySQL.
  • Verwenden einer eindeutigen Kombination von Elementen aus dem ursprünglichen SQL INSERT in einer nachfolgenden SELECT- Anweisung.
  • Verwenden einer GUID in der SQL INSERT- Anweisung und Abrufen in einer SELECT- Anweisung.
  • Verwenden der OUTPUT- Klausel in der SQL INSERT- Anweisung für MS-SQL Server 2005 und MS-SQL Server 2008.
  • Verwenden einer INSERT- Anweisung mit der RETURNING- Klausel für Oracle.
    INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323')RETURNING phone_book_id INTO v_pb_id
  • Verwenden einer INSERT- Anweisung mit der RETURNING- Klausel für PostgreSQL (seit 8.2).Die zurückgegebene Liste ist identisch mit dem Ergebnis eines INSERT.
    • Firebird hat dieselbe Syntax in DSQL-Anweisungen (Data Modification Language).Die Anweisung darf höchstens eine Zeile hinzufügen.In gespeicherten Prozeduren, Triggern und Ausführungsblöcken (PSQL) wird die oben genannte Oracle-Syntax verwendet.
      INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323')RETURNING phone_book_id
  • Bei Verwendung derFunktion IDENTITY () in H2 wird die zuletzt eingefügte Identität zurückgegeben.
    SELECT IDENTITY();

Löst aus

Wenn Trigger in der Tabelle definiert sind, für die die INSERT- Anweisung ausgeführt wird, werden diese Trigger im Kontext der Operation ausgewertet. BEVOR INSERT- Trigger ermöglichen die Änderung der Werte, die in die Tabelle eingefügt werden sollen. AFTER INSERT- Trigger können die Daten nicht mehr ändern, können jedoch verwendet werden, um Aktionen für andere Tabellen zu initiieren, z. B. um einen Überwachungsmechanismus zu implementieren.

Verweise

Externe Links

Contacts: mail@wikibrief.org
Der Inhalt ist unter der CC BY-SA 3.0-Lizenz verfugbar (sofern nicht anders angegeben).