Suche…


Syntax

  1. INSERT [LOW_PRIORITY | VERZÖGERT | HIGH_PRIORITY] [IGNORE] [INTO] Tabellenname [PARTITION (Partitionsname, ...)] [(Spaltenname, ...)] {VALUES | VALUE} ({expr | DEFAULT}, ...), (...), ... [ON DUPLICATE KEY UPDATE Spaltenname = Ausdruck [, Spaltenname = Ausdruck] ...]

  2. INSERT [LOW_PRIORITY | VERZÖGERT | HIGH_PRIORITY] [IGNORE] [INTO] Tabellenname [PARTITION (Partitionsname, ...)] SET Col_Name = {Ausdruck | DEFAULT}, ... [ON DUPLICATE KEY UPDATE Spaltenname = Ausdruck [, Spaltenname = Ausdruck] ...]

  3. INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] Tabellenname [PARTITION (Partitionsname, ...)] [(Spaltenname, ...)] SELECT ... [ON DUPLICATE KEY UPDATE Spaltenname = Ausdruck [, Spaltenname = Ausdruck] ...]

  4. Ein Ausdruck expr kann auf jede Spalte verweisen, die zuvor in einer Werteliste festgelegt wurde. Dies ist beispielsweise möglich, weil der Wert für col2 sich auf col1 bezieht, das zuvor zugewiesen wurde:
    INSERT INTO tbl_name (col1, col2) VALUES (15, col1 * 2);

  5. INSERT-Anweisungen, die die VALUES-Syntax verwenden, können mehrere Zeilen einfügen. Fügen Sie dazu mehrere Listen von Spaltenwerten hinzu, die jeweils in Klammern stehen und durch Kommas getrennt sind. Beispiel:
    INSERT in tbl_name (a, b, c) WERTE (1,2,3), (4,5,6), (7,8,9);

  6. Die Werteliste für jede Zeile muss in Klammern stehen. Die folgende Anweisung ist ungültig, da die Anzahl der Werte in der Liste nicht mit der Anzahl der Spaltennamen übereinstimmt:
    INSERT in tbl_name (a, b, c) WERTE (1,2,3,4,5,6,7,8,9);

  7. INSERT ... SELECT Syntax
    INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] Tabellenname [PARTITION (Partitionsname, ...)] [(Spaltenname, ...)] SELECT ... [ON DUPLICATE KEY UPDATE Spaltenname = Ausdruck, ...]

  8. Mit INSERT ... SELECT können Sie schnell viele Zeilen aus einer oder mehreren Tabellen in eine Tabelle einfügen. Zum Beispiel:
    INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id> 100;

Bemerkungen

Offizielle INSERT-Syntax

Grundeinsatz

INSERT INTO `table_name` (`field_one`, `field_two`) VALUES ('value_one', 'value_two');

In diesem table_name Beispiel ist table_name wo die Daten hinzugefügt werden sollen, field_one und field_two sind Felder, für die Daten festgelegt werden sollen, und value_one und value_two sind die Daten, die gegen field_one bzw. field_two sind.

Es ist empfehlenswert, die Felder, in die Sie Daten einfügen, in Ihren Code aufzulisten. Wenn sich die Tabelle ändert und neue Spalten hinzugefügt werden, würde das Einfügen brechen, falls sie nicht vorhanden sind

INSERT, DUPLICATE KEY UPDATE

INSERT INTO `table_name` 
    (`index_field`, `other_field_1`, `other_field_2`) 
    VALUES 
    ('index_value', 'insert_value', 'other_value') 
    ON DUPLICATE KEY UPDATE 
        `other_field_1` = 'update_value',
        `other_field_2` = VALUES(`other_field_2`);

Dies wird INSERT in table_name die angegebenen Werte, aber wenn der eindeutige Schlüssel bereits vorhanden ist , wird es die Aktualisierung other_field_1 einen neuen Wert zu haben.
Beim Aktualisieren von doppelten Schlüsseln kann es manchmal nützlich sein, VALUES() zu verwenden, um auf den ursprünglichen Wert zuzugreifen, der an INSERT anstatt den Wert direkt VALUES() . Auf diese Weise können Sie mit INSERT und UPDATE verschiedene Werte einstellen. Siehe das Beispiel oben , wo other_field_1 eingestellt ist insert_value auf INSERT oder update_value auf UPDATE während other_field_2 immer gesetzt other_value .

Entscheidend für die Funktion "Insert on Duplicate Key Update" (IODKU) ist das Schema, das einen eindeutigen Schlüssel enthält, der einen doppelten Konflikt signalisiert. Dieser eindeutige Schlüssel kann ein Primärschlüssel sein oder nicht. Es kann sich dabei um einen eindeutigen Schlüssel in einer einzelnen Spalte oder um einen mehrspaltigen Schlüssel (zusammengesetzter Schlüssel) handeln.

Mehrere Zeilen einfügen

INSERT INTO `my_table` (`field_1`, `field_2`) VALUES 
    ('data_1', 'data_2'),
    ('data_1', 'data_3'),
    ('data_4', 'data_5'); 

Dies ist eine einfache Möglichkeit, mit einer INSERT Anweisung mehrere Zeilen gleichzeitig hinzuzufügen.

Diese Art von 'Batch'-Insert ist viel schneller als das Einfügen von Zeilen nacheinander. Normalerweise ist das Einfügen von 100 Zeilen in eine einzelne Batch-Insertion 10-mal so schnell wie das Einfügen aller Zeilen.

Vorhandene Zeilen ignorieren

Beim Importieren großer Datensätze kann es unter bestimmten Umständen wünschenswert sein, Zeilen zu überspringen, die normalerweise dazu führen, dass die Abfrage aufgrund einer Spaltenbeschränkung fehlschlägt, z. Dies kann mit INSERT IGNORE .

Betrachten Sie die folgende Beispieldatenbank:

SELECT * FROM `people`;
--- Produces:
+----+------+
| id | name |
+----+------+
|  1 | john |
|  2 | anna |
+----+------+


INSERT IGNORE INTO `people` (`id`, `name`) VALUES
    ('2', 'anna'), --- Without the IGNORE keyword, this record would produce an error
    ('3', 'mike');

SELECT * FROM `people`;
--- Produces:
+----+--------+
| id |  name  |
+----+--------+
|  1 |  john  |
|  2 |  anna  |
|  3 |  mike  |
+----+--------+

Es ist wichtig zu wissen, dass INSERT IGNORE auch andere Fehler im Hintergrund überspringt. Hier heißt es in den offiziellen Dokumentationen von Mysql:

Datenkonvertierungen, die Fehler auslösen würden, bricht die Anweisung ab, wenn IGNORE> nicht angegeben wird. Mit IGNORE werden ungültige Werte an die nächsten Werte angepasst und> eingefügt. Es werden Warnungen ausgegeben, die Anweisung bricht jedoch nicht ab.

Hinweis: - Der folgende Abschnitt wird der Vollständigkeit halber hinzugefügt, er gilt jedoch nicht als bewährte Methode (dies würde beispielsweise fehlschlagen, wenn eine weitere Spalte in die Tabelle eingefügt wurde).

Wenn Sie den Wert der entsprechenden Spalte für alle Spalten in der Tabelle angeben, können Sie die Spaltenliste in der INSERT Anweisung wie folgt ignorieren:

INSERT INTO `my_table` VALUES 
        ('data_1', 'data_2'),
        ('data_1', 'data_3'),
        ('data_4', 'data_5');

INSERT SELECT (Einfügen von Daten aus einer anderen Tabelle)

Dies ist die grundlegende Methode zum Einfügen von Daten aus einer anderen Tabelle mit der SELECT-Anweisung.

INSERT INTO `tableA` (`field_one`, `field_two`) 
   SELECT `tableB`.`field_one`, `tableB`.`field_two` 
   FROM `tableB` 
   WHERE `tableB`.clmn <> 'someValue'
   ORDER BY `tableB`.`sorting_clmn`;

Sie können SELECT * FROM , aber dann tableA und tableB müssen Spaltenanzahl passende und Datentypen entsprechen.

Spalten mit AUTO_INCREMENT werden wie in der INSERT with VALUES Klausel behandelt.

Diese Syntax erleichtert das Befüllen von (temporären) Tabellen mit Daten aus anderen Tabellen. Dies gilt umso mehr, wenn die Daten im Insert gefiltert werden sollen.

INSERT mit AUTO_INCREMENT + LAST_INSERT_ID ()

Wenn eine Tabelle einen AUTO_INCREMENT PRIMARY KEY , wird normalerweise keine in diese Spalte PRIMARY KEY . Geben Sie stattdessen alle anderen Spalten an und fragen Sie nach der neuen ID.

CREATE TABLE t (
    id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL,
    this ...,
    that ...,
    PRIMARY KEY(id) );

INSERT INTO t (this, that) VALUES (..., ...);
SELECT LAST_INSERT_ID() INTO @id;
INSERT INTO another_table (..., t_id, ...) VALUES (..., @id, ...);

Beachten Sie, dass LAST_INSERT_ID() an die Sitzung gebunden ist. Selbst wenn mehrere Verbindungen in dieselbe Tabelle LAST_INSERT_ID() , LAST_INSERT_ID() jede mit ihrer eigenen ID eine eigene ID.

Ihre Client-API verfügt wahrscheinlich über eine alternative Methode, um LAST_INSERT_ID() ohne tatsächlich SELECT LAST_INSERT_ID() und den Wert an den Client zurückzugeben, anstatt ihn in einer @variable in MySQL zu @variable . Dies ist normalerweise vorzuziehen.

Länger, detaillierteres Beispiel

Die "normale" Verwendung von IODKU ist das Auslösen eines "Duplikatschlüssels" basierend auf einem UNIQUE Schlüssel, nicht dem AUTO_INCREMENT PRIMARY KEY . Das Folgende zeigt, wie z. Beachten Sie, dass es nicht die nicht liefert id in der INSERT.

Setup für die folgenden Beispiele:

CREATE TABLE iodku (
    id INT AUTO_INCREMENT NOT NULL,
    name VARCHAR(99) NOT NULL,
    misc INT NOT NULL,
    PRIMARY KEY(id),
    UNIQUE(name)
) ENGINE=InnoDB;

INSERT INTO iodku (name, misc)
    VALUES
    ('Leslie', 123),
    ('Sally', 456);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
+----+--------+------+
| id | name   | misc |
+----+--------+------+
|  1 | Leslie |  123 |
|  2 | Sally  |  456 |
+----+--------+------+

Der Fall, dass IODKU ein "Update" durchführt und LAST_INSERT_ID() die relevante id LAST_INSERT_ID() :

INSERT INTO iodku (name, misc)
    VALUES
    ('Sally', 3333)            -- should update
    ON DUPLICATE KEY UPDATE    -- `name` will trigger "duplicate key"
    id = LAST_INSERT_ID(id),
    misc = VALUES(misc);
SELECT LAST_INSERT_ID();       -- picking up existing value
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+

Der Fall, in dem IODKU eine "Einfügung" durchführt und LAST_INSERT_ID() die neue id abruft:

INSERT INTO iodku (name, misc)
    VALUES
    ('Dana', 789)          -- Should insert
    ON DUPLICATE KEY UPDATE
    id = LAST_INSERT_ID(id),
    misc = VALUES(misc);
SELECT LAST_INSERT_ID();   -- picking up new value
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+

Resultierender Tabelleninhalt:

SELECT * FROM iodku;
+----+--------+------+
| id | name   | misc |
+----+--------+------+
|  1 | Leslie |  123 |
|  2 | Sally  | 3333 |  -- IODKU changed this
|  3 | Dana   |  789 |  -- IODKU added this
+----+--------+------+

Verlorene AUTO_INCREMENT-IDs

Mehrere "Einfügen" -Funktionen können IDs "brennen". Hier ein Beispiel für die Verwendung von InnoDB (andere Engines funktionieren möglicherweise anders):

CREATE TABLE Burn (
    id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL,
    name VARCHAR(99) NOT NULL,
    PRIMARY KEY(id),
    UNIQUE(name)
        ) ENGINE=InnoDB;

INSERT IGNORE INTO Burn (name) VALUES ('first'), ('second');
SELECT LAST_INSERT_ID();          -- 1
SELECT * FROM Burn ORDER BY id;
  +----+--------+
  |  1 | first  |
  |  2 | second |
  +----+--------+

INSERT IGNORE INTO Burn (name) VALUES ('second');  -- dup 'IGNOREd', but id=3 is burned
SELECT LAST_INSERT_ID();          -- Still "1" -- can't trust in this situation
SELECT * FROM Burn ORDER BY id;
  +----+--------+
  |  1 | first  |
  |  2 | second |
  +----+--------+

INSERT IGNORE INTO Burn (name) VALUES ('third');
SELECT LAST_INSERT_ID();           -- now "4"
SELECT * FROM Burn ORDER BY id;    -- note that id=3 was skipped over
  +----+--------+
  |  1 | first  |
  |  2 | second |
  |  4 | third  |    -- notice that id=3 has been 'burned'
  +----+--------+

Stellen Sie sich das (ungefähr) so vor: Zuerst sieht der Insert, wie viele Zeilen eingefügt werden könnten . Dann holen Sie sich so viele Werte aus dem auto_increment für diese Tabelle. Fügen Sie zum Schluss die Zeilen ein, verwenden Sie bei Bedarf die IDs und brennen Sie die restlichen Reste.

Der Rest kann nur wiederhergestellt werden, wenn das System heruntergefahren und neu gestartet wird. Beim Neustart wird effektiv MAX(id) ausgeführt. Dies kann IDs wiederverwenden, die von DELETEs der höchsten ID (s) verbrannt oder freigegeben wurden.

REPLACE kann jede REPLACE von INSERT (einschließlich REPLACE , REPLACE DELETE + INSERT ) IDs brennen. In InnoDB kann die globale (nicht Session!) Variable innodb_autoinc_lock_mode verwendet werden, um einige der innodb_autoinc_lock_mode zu steuern.

Beim "Normalisieren" langer Zeichenfolgen in eine AUTO INCREMENT id kann es leicht zum Brennen kommen. Dies kann dazu führen, dass die Größe des von Ihnen gewählten INT überläuft.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow