Fügt eine einzelne Zeile (Syntax 1) oder eine Reihe von Zeilen von einer anderen Stelle in der Datenbank (Syntax 2) in eine Tabelle ein.
INSERT [ INTO ] [ Eigentümer.]Tabellenname [ ( Spaltenname, ... ) ] [ ON EXISTING { ERROR | SKIP | UPDATE [ DEFAULTS { ON | OFF } ] } ] { DEFAULT VALUES | VALUES Zeilenwertkonstruktor [, ... ] } [ OPTION( Abfragen-Hint [, ... ] ) ]
INSERT [ INTO ] [ Eigentümer.]Tabellenname [ ( Spaltenname, ... ) ] [ ON EXISTING { ERROR | SKIP | UPDATE [ DEFAULTS { ON | OFF } ] } ] [ WITH AUTO NAME ] Select-Anweisung [ OPTION( Abfragen-Hint[, ... ] ) ]
Abfragen-Hint : MATERIALIZED VIEW OPTIMIZATION Optionswert | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | Optionsname = Optionswert
Optionsname : Bezeichner
Optionswert : Hostvariable (Bezeichner zulässig), Zeichenfolge, Bezeichner oder Zahl
Insert-Ausdruck :
Ausdruck | DEFAULT
Zeilenwertkonstruktor : ( [ Insert-Ausdruck [, ... ] ])
VALUES-Klausel Verwenden Sie die VALUES-Klausel, um die einzufügenden Werte anzugeben. Wenn Sie die für die Spalten definierten Standardwerte eingeben möchten, geben Sie DEFAULT VALUES an. Sie können auch VALUES () angeben. Dies ist DEFAULT VALUES gleichwertig. Die VALUES-Klausel unterstützt auch Zeilenwertkonstruktoren, damit Sie mehrere Zeilen von Werten mit einer einzigen Anweisung einfügen können. Anzahl und Reihenfolge der Insert-Ausdruck-Werte in jedem Zeilewertkonstruktor müssen der in der INTO-Klausel angegebenen Spaltenliste entsprechen. Wenn keine Spaltenliste angegeben ist, wird angenommen, dass es sich um die vollständige sortierte Spaltenliste für die Tabelle handelt. Wenn Sie eine leere Spaltenliste () angeben, muss jede der Spalten in der Tabelle einen Standardwert haben.
Wenn beim Einfügen von einer der Zeilen ein Fehler auftritt, werden alle Änderungen zurückgesetzt.
WITH AUTO NAME-Klausel WITH AUTO NAME gilt nur für Syntax 2. Wenn Sie WITH AUTO NAME angeben, bestimmen die Namen der Elemente im Abfrageblock, in welche Spalte die Daten gehören. Die Elemente des Abfrageblocks sollten entweder Spaltenreferenzen oder Aliasausdrücke sein. Zielspalten, die im Abfrageblock nicht definiert sind, erhalten ihren Standardwert. Dies ist sinnvoll, wenn die Anzahl von Spalten in der Zieltabelle sehr groß ist.
Die INSERT-Anweisung gibt einen Fehler zurück, wenn die WITH AUTO NAME-Klausel angegeben ist und der Abfrageblock Spalten enthält, die nicht mit Spalten in der Zieltabelle übereinstimmen. Zum Beispiel gibt die Ausführung der folgenden Anweisung einen Fehler, wonach die Spalte "operation" im SELECT-Abfrageblock mit keiner der Spalten in der Tabelle MyTable5 übereinstimmt.
CREATE TABLE MyTable5( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128), TableNameLen INT ); INSERT INTO MyTable5 WITH AUTO NAME SELECT length(t.table_name) AS TableNameLen, t.table_name AS TableName, 1 as operation FROM SYS.SYSTAB t WHERE table_id <= 10; |
ON EXISTING-Klausel Die ON EXISTING-Klausel der INSERT-Anweisung gilt für beide Syntaxen. Bestehende Zeilen werden in einer Tabelle basierend auf einer Primärschlüsselschleife mit neuen Spaltenwerten aktualisiert. Diese Klausel kann nur bei Tabellen angewendet werden, die einen Primärschlüssel besitzen. Der Versuch, diese Klausel bei Tabellen ohne Primarschlüssel anzuwenden, generiert einen Syntaxfehler. Sie können keine Werte in eine Proxytabelle mit der ON EXISTING-Klausel einlesen.
Wenn es voraussichtlich viele Zeilen gibt, die der ON EXISTING-Bedingung entsprechen, kann es sinnvoll sein, stattdessen die MERGE-Anweisung zu verwenden. Die MERGE-Anweisung bietet mehr Kontrolle über die Aktionen, die Sie bei übereinstimmenden Zeilen durchführen können. Sie stellt auch eine ausgefeiltere Syntax zur Verfügung um festzulegen, was eine Übereinstimmung ausmacht. Siehe MERGE-Anweisung.
Wenn Sie die ON EXISTING-Klausel angeben, führt der Datenbankserver eine Primärschlüsselsuche für jede Eingabezeile durch. Wenn die entsprechende Zeile in der Tabelle nicht bereits existiert, wird die neue Zeile eingefügt. Für Zeilen, die in der Tabelle bereits existieren, können Sie sich dafür entscheiden, die Eingabezeile stillschweigend zu ignorieren (SKIP), eine Fehlermeldung aufgrund doppelter Schlüsselwerte auszugeben (ERROR) oder die alten Werte mit den Werte aus der Eingabezeile zu aktualisieren (UPDATE). Wenn Sie nicht ON EXISTING definieren, führt die Einfügung von Zeilen in eine Tabelle, in der diese Zeilen bereits existieren, standardmäßig zur Ausgabe der Fehlermeldung über doppelte Schlüsselwerte, was der Verwendung der ON EXISTING ERROR-Klausel entspricht. Übersprungene Zeilen werden in die @@rowcount-Variable einbezogen. Siehe @@rowcount, globale Variable.
Wenn Sie die ON EXISTING UPDATE-Klausel verwenden, wird die Eingabezeile mit der gespeicherten Zeile verglichen. Spaltenwerte, die in der Eingabezeile explizit angeführt sind, ersetzen die entsprechenden Spaltenwerte in der gespeicherten Zeile. Spaltenwerte, die nicht explizit in der Eingabezeile angegeben sind, führen hingegen zu keiner Änderung der entsprechenden Werte in der gespeicherten Zeile. Ausgenommen davon sind Spalten mit Standardwerten. Wenn Sie die ON EXISTING UPDATE-Klausel mit Spalten verwenden, die Standardwerte umfassen (einschließlich DEFAULT AUTOINCREMENT-Spalten), können Sie zusätzlich angeben, ob die Spaltenwerte mit den Standardwerten aktualisiert werden sollen, indem Sie ON EXISTING UPDATE DEFAULTS ON angeben, oder ob der Spaltenwert so wie er ist belassen werden soll, indem Sie ON EXISTING UPDATE DEFAULTS OFF angeben. Wenn keine Angaben gemacht werden, ist das Standardverhalten ON EXISTING UPDATE DEFAULTS OFF.
DEFAULTS ON- und DEFAULTS OFF-Parameter wirken sich nicht auf Werte in DEFAULT TIMESTAMP, DEFAULT UTC TIMESTAMP oder DEFAULT LAST USER aus. Bei diesen Spalten wird der Wert in der gespeicherten Zeile immer während des UPDATE aktualisiert.
Wenn Sie die Klauseln ON EXISTING SKIP und ON EXISTING ERROR verwenden und die Tabelle DEFAULT-Spalten enthält, berechnet der Server die Standardwerte auch für Zeilen, die bereits existieren. Standardwerte wie AUTOINCREMENT bewirken daher sogar für übersprungene Zeilen Nebeneffekte. Im Fall von AUTOINCREMENT führt dies zu übersprungenen Werten in der AUTOINCREMENT-Sequenz. Mit dem folgenden Beispiel wird dies veranschaulicht:
CREATE TABLE t1( c1 INT PRIMARY KEY, c2 INT DEFAULT AUTOINCREMENT ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 30 ); |
Die in der ersten INSERT-Anweisung definierte Zeile wird eingefügt und c2 wird auf 1 gesetzt. Die in der zweiten INSERT-Anweisung definierte Zeile wird übersprungen, weil sie mit der bestehenden Zeile übereinstimmt. Der autoincrement-Zähler allerdings zählt auf 2 hoch (ohne Auswirkung auf die existierende Zeile). Die in der dritten INSERT-Anweisung definierte Zeile wird eingefügt und der Wert von c2 wird auf 3 gesetzt. Daher sind die im vorigen Beispiel eingefügten Werte die folgenden:
20,1 30,3 |
Wenn Sie SQL Remote verwenden, dürfen Sie DEFAULT LAST USER-Spalten nicht replizieren. Wenn die Spalte repliziert wird, wird der Spaltenwert auf den SQL Remote-Benutzer, und nicht auf den replizierten Wert gesetzt.
OPTION-Klausel Verwenden Sie diese Klausel, um Hints für das Ausführen der Anweisung anzugeben. Die folgenden Hints werden unterstützt:
OPTION( isolation_level = ... )
-Angabe im Abfragetext Vorrang vor allen anderen Festlegungen der Isolationsstufe für eine Abfrage hat.
Eine Beschreibung dieser Optionen finden Sie unter OPTION-Klausel, SELECT-Anweisung.
Die INSERT-Anweisung wird verwendet, um Zeilen in eine Datenbanktabelle einzufügen.
Da Textindizes und materialisierte Ansichten von Änderungen an den darunterliegenden Tabellendaten betroffen sind, ist es sinnvoll, abhängige Textindizes oder materialisierte Ansichten vor dem Massenimport von Daten (LOAD TABLE, INSERT, MERGE) in die Basistabellen zu kürzen. Siehe TRUNCATE-Anweisung und TRUNCATE TEXT INDEX-Anweisung.
Syntax 1 Fügt eine einzelne Zeile oder mehrere Zeilen mit den angegebenen Ausdruckswerten für die Spalte ein. Falls mehrere Zeilen angegeben sind, werden sie durch zusätzliche Klammern getrennt. Das Schlüsselwort DEFAULT kann verwendet werden, um den Standardwert für die Spalte einzufügen. Wenn die optionale Liste der Spaltennamen angegeben ist, werden die Werte einzeln in die angegebenen Spalten eingefügt. Wird keine Liste für die Spaltennamen definiert, werden die Werte in der Reihenfolge in die Tabelle eingefügt, in der sie generiert werden (dieselbe Reihenfolge wie mit SELECT *). Die Zeile wird an einer beliebigen Stelle in die Tabelle eingefügt. (In relationalen Datenbanken werden Tabellen nicht sortiert.)
Syntax 2 Führt eine Masseneinfügung in eine Tabelle mit den Ergebnismengen einer vollständigen allgemeinen SELECT-Anweisung aus. Einfügungen werden in einer beliebigen Reihenfolge vorgenommen, es sei denn, die SELECT-Anweisung enthält eine ORDER BY-Klausel. Siehe SELECT-Anweisung.
Die Spalten aus der Auswahlliste werden ordinal den in der Spaltenliste angegebenen Spalten oder sequentiell in der Reihenfolge, in der die Spalten erstellt wurden, zugeordnet.
INSERT-Anweisungen können in Ansichten ausgeführt werden, wenn die Abfragespezifikation, die die Ansicht definiert, aktualisierbar ist. Weitere Hinweise zur Erkennung von Ansichten, die inhärent nicht aktualisierbar sind, finden Sie unter Mit regulären Ansichten arbeiten.
In Tabellen eingefügte Zeichenfolgen werden immer in der gleichen Schreibung (groß oder klein) gespeichert, in der sie eingegeben wurden, unabhängig davon, ob die Datenbank die Groß-/Kleinschreibung berücksichtigt oder nicht. So wird z.B. die Zeichenfolge Value, die in eine Tabelle eingegeben wurde, in der Datenbank immer mit einem großen V und dem Rest in Kleinbuchstaben gespeichert. SELECT-Anweisungen geben die Zeichenfolge als Value zurück. Wenn die Datenbank die Groß-/Kleinschreibung jedoch nicht berücksichtigt, ist Value dasselbe wie value, VALUE usw. Wenn außerdem ein Primärschlüssel für eine Spalte einen Eintrag mit Value enthält, wird ein INSERT von value zurückgewiesen, da der Primärschlüssel dann nicht eindeutig wäre.
Das Einfügen großer Datenmengen mit der INSERT-Anweisung aktualisiert auch die Spaltenstatistiken.
Wenn Sie mehrere Zeilen in eine Tabelle einfügen möchten, ist es effektiver, einen Cursor zu deklarieren, wo dies möglich ist, als viele getrennte INSERT-Anweisungen auszuführen. Bevor Sie Daten einfügen, können Sie den Prozentsatz des Speicherplatzes festlegen, der für spätere Updates frei bleiben soll. Siehe ALTER TABLE-Anweisung.
INSERT-Berechtigung für die Tabelle ist erforderlich.
Wenn die Klausel ON EXISTING UPDATE angegeben ist, sind zusätzlich UPDATE-Berechtigungen für die Tabelle erforderlich.
Keine.
SQL/2008 Die INSERT-Anweisung ist eine Kernfunktion des SQL/2008-Standards. Die DEFAULT VALUES-Klausel ist die optionale SQL-Sprachenfunktion F222, (INSERT-Anweisung: DEFAULT VALUES-Klausel). Die Unterstützung für Zeilenwert-Konstruktoren in einer INSERT-Anweisung ist Teil der optionalen SQL Sprachenfunktion F641, "Zeile und Tabelle Konstruktoren". Das VALUES-Schlüsselwort ist eine Erweiterung des Herstellers und in SQL Anywhere obligatorisch, um die Liste der einzufügenden Ausdrücke anzugeben. VALUES ist jedoch nicht Teil von SQL/2008.
Einige optionale Konstruktionen sind Erweiterungen des Herstellers. Es handelt sich dabei um die folgenden:
Die INSERT ... ON EXISTING-Klausel ist eine Erweiterung des Herstellers. Eine SQL/2008-kompatible Entsprechung ist in vielen Fällen die MERGE-Anweisung. Siehe MERGE-Anweisung.
Die OPTION-Klausel.
Die WITH AUTO NAME-Klausel.
Fügen Sie "Eastern Sales department" zur Datenbank hinzu:
INSERT INTO Departments ( DepartmentID, DepartmentName ) VALUES ( 230, 'Eastern Sales' ); |
Erstellen Sie die Tabelle 'DepartmentHead' mit den Namen der Abteilungsleiter (department heads) und ihren Abteilungen (departments) unter Verwendung der Syntax WITH AUTO NAME:
CREATE TABLE DepartmentHead( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, DepartmentName VARCHAR(128), ManagerName VARCHAR(128) ); INSERT INTO DepartmentHead WITH AUTO NAME SELECT GivenName || ' ' || Surname AS ManagerName, DepartmentName FROM Employees JOIN Departments ON EmployeeID = DepartmentHeadID; |
Erstellen Sie die Tabelle 'MyTable5' und fügen Sie mithilfe der WITH AUTO NAME-Syntax Daten ein.
CREATE TABLE MyTable5( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128), TableNameLen INT ); INSERT INTO MyTable5 WITH AUTO NAME SELECT length(t.table_name) AS TableNameLen, t.table_name AS TableName FROM SYS.SYSTAB t WHERE table_id <= 10; |
Fügen Sie eine neue Abteilung ein, wobei Sie die Anweisung auf Isolationsstufe 3 ausführen und nicht die aktuelle Isolationsstufeneinstellung der Datenbank verwenden.
INSERT INTO Departments (DepartmentID, DepartmentName, DepartmentHeadID) VALUES(600, 'Foreign Sales', 129) OPTION( isolation_level = 3 ); |
Mit dem folgenden Beispiel werden drei Zeilen in eine Tabelle eingefügt:
INSERT INTO T (c1,c2,c3) VALUES (1,10,100), (2,20,200), (3,30,300); |
Im folgenden Beispiel werden durch die INSERT-Anweisung drei Zeilen in eine Tabelle mit vier Spalten eingefügt, in der jede Spalte einen Standardwert hat:
INSERT INTO T () VALUES (), (), (); |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |