Sql-und-Xml - Home

Sql-Tutorial

Zeilen einfügen mit INSERT

Syntax

  • INSERT INTO <Tabellenname>(<Spaltenname> [, weitere Spaltennamen])
    	VALUES (<Wert für die erste Spalte> [, weitere Werte])
    Einfache Form: Hinter VALUES werden alle einzufügenden Werte der Reihe nach aufgelistet. Es wird genau eine neue Zeile erzeugt.
  • INSERT INTO <Tabellenname>(<Spaltenname> [, weitere Spaltennamen])
    
    	SELECT <Spalte-1> [, weitere Ausgaben]
    	[FROM ...]
    	[WHERE ...]
    	[GROUP BY ...]
    	[HAVING ...]
    Einfügen mehrerer Zeilen. Als Select-Anweisung ist jede beliebige Anweisung möglich, sofern die Zahl der Ausgabespalten mit der Zahl der Zielspalten sowie die Datentypen übereinstimmen. Das Select-Recordset kann auch keine Zeilen zurückliefern, dies ist kein Fehler, es werden keine Zeilen hinzugefügt.

Beispiele

  • INSERT INTO ARTIKEL(A_NR, A_NAME, A_PREIS)
    		VALUES(12, 'Oberhemd', 39.80)
    Dies fügt in die Tabelle Artikel die erste Zeile aus der Artikel.txt ein. Dies gelingt allerdings nur deshalb, da die Spalte A_NR keine automatisch erzeugte fortlaufende Nummer enthält und deshalb der Wert für den Primärschlüssel per Hand festgelegt werden muß.
  • Für den Fall, daß die Tabelle einen automatisch erzeugten Wert enthält, muß weder die Spalte noch ein Wert angegeben werden. Beispiel:
    CREATE TABLE [Artikel-mit-Id]
    	(A_NR int Identity(1, 1) Primary Key,
    		A_Name varchar(50),
    		A_Preis money)
    Dies erzeugt eine Tabelle, bei welcher der ersten Spalte ein automatisch erstellter Wert zugewiesen wird
    INSERT INTO [Artikel-mit-Id](A_NAME, A_PREIS)
    	VALUES ('Oberhemd', 39.80)
    In die neue Tabelle wird eine Zeile eingetragen. Ist die Tabelle soeben neu erstellt worden, so erhält die neue Zeile den Wert 1 als Primärschlüssel.
  • INSERT INTO ARTIKEL(A_NR, A_NAME, A_PREIS)
    	SELECT 12, 'Oberhemd', 39.80
    	UNION
    	SELECT 22, 'Mantel', 360.00
    	UNION
    	SELECT 11, 'Oberhemd', 44.20
    	UNION
    	SELECT 13, 'Hose', 110.50
    Dies fügt Daten ein, die über eine Dummy-Select-Anweisung mit UNION zusammengestellt wurden. Beachten Sie, daß eine solche Konstruktion mit Ms-Access nicht gelingt. Dort kann man mit dem Einfügen einer Dummy-Tabelle sowie der TOP 1 - Klausel erreichen, daß eine Zeile zurückgegeben wird. Die UNION-Anweisung läßt sich jedoch nicht direkt in eine Tabelle einfügen, sie muß in einer Unterabfrage versteckt werden. Die folgende Anweisung ist möglich:
    CREATE TABLE ATest(A_NR int, A_NAME varchar(50), A_PREIS money)
    INSERT INTO ATest(A_Nr, A_NAME,A_PREIS)
    	SELECT A.A_Nr, A.A_Name, A.A_Preis
    	From (
    		SELECT Top 1 12 As A_NR, 'Oberhemd' AS A_NAME,
    		39.80 AS A_PREIS From Artikel
    		UNION
    		SELECT Top 1 22, 'Mantel', 360.00 From Artikel
    		UNION
    		SELECT Top 1 11, 'Oberhemd', 44.20 From Artikel
    		UNION
    		SELECT Top 1 13, 'Hose', 110.50 From Artikel
    		Order By A_Nr)
    	As A
  • INSERT INTO ARTIKEL(A_NR, A_NAME, A_PREIS)
    	SELECT A.A_NR + 100,
    		A.A_NAME,
    		A.A_PREIS * 1.1
    	FROM ARTIKEL As A
    Dies fügt in die Tabelle Artikel vier neue Zeilen ein, die Artikel-Nummer ist um 100, der Artikelpreis um 10% erhöht.
  • SELECT A.A_NR, A.A_NAME,
    	A.A_PREIS As Gesamt
    		INTO ArtikelAuswertung
    	FROM ARTIKEL As A
    	WHERE 0 = 1
    
    INSERT INTO ArtikelAuswertung
    	(A_NR, A_NAME, Gesamt)
    SELECT A.A_NR, A.A_NAME,
    	SUM(A.A_PREIS * U.A_STUECK)
    FROM ARTIKEL As A INNER JOIN UMSATZ As U
    	On A.A_NR = U.A_NR
    GROUP BY A.A_NR, A.A_NAME
    Dies ist eine typische Anwendung der INSERT-Anweisung, um Daten unabhängig von der Hauptdatenbank auswerten oder weiterverarbeiten zu können. Zunächst wird die gewünschte Zieltabelle erstellt, indem eine passende SELECT-Anweisung mit INTO in eine neue Tabelle umgelenkt und in diese mit '0 = 1' keine Daten übertragen werden. Anschließend werden die tatsächlich gewünschten Nutzdaten aggregiert und kopiert. Eine solche Trennung anstelle eines direkten SELECT ... INTO ... FROM kann hilfreich sein, falls die Tabelle auf jeden Fall erstellt werden soll, es jedoch bsp. zu Laufzeitfehlern bei der SELECT-Abfrage kommen kann, so daß diese nicht ausgeführt wird.
  • Verwenden einer gespeicherten Prozedur mit Parametern zum Einfügen von Daten:
    CREATE PROCEDURE up_ins_Artikel
    		@A_NR int,
    		@A_NAME nvarchar(50),
    		@A_PREIS money
    As
    	INSERT INTO ARTIKEL(A_NR, A_NAME, A_PREIS)
    	VALUES (@A_NR, @A_NAME, @A_PREIS)
    
    Execute up_ins_Artikel 50, 'Schlapphut', 49.90
    Dies ist die Standard-Syntax zur Erzeugung gespeicherter Prozeduren mit Parametern. Die Prozedur nutzt die Parameterwerte, um eine Zeile einzufügen. Ms-Access hat seine eigene Syntax. Hier dürfen - bei der Verwendung über .NET - die Parameter nicht deklariert werden und sind nach Position anzusprechen. Mit ADO ist eine Syntax möglich, wie sie innerhalb DAO verwendet wird:
    PARAMETERS [@a_nr] int, [@a_name] nvarchar(50), [@a_preis] money;
    	CREATE ... 

Bemerkung zu allen Data Manipulation Language - Befehlen (DML)

  • Falls Sie bislang noch wenig Erfahrung mit Datenbank-Befehlen haben: Beachten Sie, daß es auf dieser Ebene des Zugriffs keinen 'Rückgängig-Button' mehr gibt, wie Sie ihn vielleicht von Word oder Excel gewohnt sind. Eine Datenbank stellt einen elementaren Datenspeicher dar, INSERT/UPDATE/DELETE verändert diesen Speicher direkt. Und was Sie eingefügt, geändert oder gelöscht haben, ist unwiderruflich eingefügt, geändert und gelöscht.
    Falls es in Programmen wie Word einen Rückgängig-Button gibt, so setzt dies in irgendeiner Form eine Datenbankstruktur voraus, welche sich die zuletzt durchgeführten Aktionen merkt und diese zurücksetzt. Benötigen Sie auf der Ebene einer Datenbank eine Historie, so muß diese explizit in Form eines Tabellenschemas erstellt und zu einer Zeile nicht nur die aktuellen Werte, sondern zusätzlich das Änderungsdatum erfaßt werden. Alternativ kann man eine zusätzliche Tabelle erstellen und immer die drei letzten Versionen in dieser ablegen.

© 2003-2014 Jürgen Auer, Berlin.