Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Einfügebefehl vs. T-SQL-Abfragesyntax mit Beispielen

Entwickler sind lebenslange Studenten. Neues Wissen so schnell wie möglich zu erlangen, ist immer unser Job. Wenn Sie aus dem T-SQL-Lager kommen, was ist der schnellere Weg, um MySQL zu lernen? Oft möchten Sie Syntaxen vergleichen. Letztes Mal haben Sie gelernt, wie man eine Tabelle in MySQL erstellt. Unser heutiger Beitrag bringt Sie einen Schritt weiter. Wir fügen Datensätze mit MySQL INSERT ein.

Wie einfach kann es sein? Beide Datenbankplattformen verwenden SQL, aber wir wissen, dass diese beiden Datenbankprodukte ihre wenigen Ergänzungen zur Standard-SQL-Syntax haben. MySQL INSERT ist da keine Ausnahme.

Wenn Sie es also leid sind, Referenzen für MySQL und SQL Server zu vergleichen, ist heute Ihr Glückstag. Ich habe die Syntax kuratiert und den Vergleich für Sie durchgeführt. Außerdem werden wir Beispiele zum Ausprobieren haben. Endlich haben wir einen weiteren kostenlosen Spickzettel.

Jetzt, bevor wir eintauchen, können Sie auch einen KOSTENLOSEN PDF-Spickzettel zu diesem Artikel erhalten, indem Sie das Anmeldeformular unten ausfüllen.

[sendpulse-form id=”12097″]

Bereit? Großartig!

MySQL INSERT INTO Abfragesyntax (Tabellenwertkonstruktoren)

Aber bevor wir in die Details eintauchen, lassen Sie uns ein paar Dinge klarstellen:

  • Die MySQL-Version, die ich hier verwende, ist 8.0.23 mit der InnoDB-Speicher-Engine.
  • Die SQL Server-Version ist 2019.

Versuchen wir zunächst, einen Datensatz in eine Tabelle einzufügen. Die grundlegende Syntax ähnelt der für SQL Server. Dies ist jedoch der Fall, wenn Sie den Datenbank- und Schemanamen nicht einschließen und die Spaltennamen nicht in Backticks einschließen.

CREATE TABLE testdatabase.people
(`ID` int NOT NULL PRIMARY KEY,
 `Lastname` varchar(50) NOT NULL,
 `FirstName` varchar(50) NOT NULL,
 `MiddleName` varchar(50) NULL DEFAULT '',
 `Rank` varchar(20) NOT NULL,
 `Ship` varchar(50) NOT NULL,
 `ShipRegistry` varchar(20) NOT NULL,
 `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP());
  
INSERT INTO people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Die Angabe des tatsächlichen Standorts der Tabelle unterscheidet sich geringfügig. Wie ich in diesem Beitrag angedeutet habe, ist eine Datenbank gleichbedeutend mit einem Schema in MySQL. Sehen Sie sich das modifizierte Beispiel unten an:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Ist Ihnen aufgefallen, dass der Schemaname oben fehlt?

In der Zwischenzeit bildet die obige VALUES-Klausel einen Tabellenwertkonstruktor. Ebenso hat SQL Server diese Funktion ebenfalls.

Fügen Sie mehrere Zeilen in Tabellen in MySQL ein

Versuchen wir, mehrere Zeilen einzufügen.

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES (4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       (5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Der obige Code fügt zwei Datensätze mit zwei Tabellenwertkonstruktoren ein. Anstelle von Literalwerten können Sie auch Ausdrücke verwenden. Das folgende Beispiel verwendet eine Unterabfrage für jede Spalte:

CREATE TABLE testdatabase.people2 LIKE people;

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (5, (SELECT Lastname FROM people WHERE ID=5), 
           (SELECT Firstname FROM people WHERE ID=5), 
           (SELECT MiddleName FROM people WHERE ID=5),
           (SELECT `Rank` FROM people WHERE ID=5),
           (SELECT Ship FROM people WHERE ID=5),
           (SELECT ShipRegistry FROM people WHERE ID=5));

Die Unterabfragen sehen in der obigen Abfrage redundant aus. Aber dies wird einen Fehler erzeugen:

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (SELECT `ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, 
        `Ship`, `ShipRegistry` FROM people);    -- ERROR!

Der Tabellenwertkonstruktor erwartet für jedes Feld in der Spaltenliste ein Literal oder einen Ausdruck. Darüber hinaus geben die Unterabfragen im vorherigen Beispiel eine einzelne Zeile mit einem Wert zurück, und das ist gültig. Die obige SELECT-Anweisung löst jedoch einen Fehler aus, da sie mehrere Zeilen und Spalten zurückgibt.

Eine andere Möglichkeit besteht darin, das ROW-Schlüsselwort wie im folgenden Beispiel anzugeben:

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES ROW(4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       ROW(5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Aber das Schlüsselwort ROW in der INSERT-Anweisung wird in SQL Server nicht unterstützt.

MySQL INSERT INTO mit SELECT aus einer anderen Tabelle

Mit der SELECT-Anweisung können Sie Datensätze zu einer Tabelle hinzufügen:

INSERT INTO people2
(ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;

Wie Sie sehen können, ist es dasselbe mit T-SQL ohne den Datenbanknamen, den Schemanamen und das Backtick-Zeichen. Rang ist übrigens ein reserviertes Wort.

Daher sind die Backtick-Zeichen, die das Wort Rank einschließen, ein Muss.

Sie können es ohne die Spaltenliste ausdrücken. Geben Sie einfach die Spaltennamen in der gleichen Reihenfolge wie die Spaltenanordnung der Zieltabelle an.

TRUNCATE TABLE testdatabase.people2;

INSERT INTO testdatabase.people2
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate 
FROM people;

SELECT * FROM testdatabase.people2

Siehe die Ausgabe unten von dbForge Studio für MySQL:

Hört sich gut an? Lassen Sie uns mehr auf das Thema Umgang mit Spaltenwerten eingehen.

INSERT und Tabellenspaltenwerte

Dieser Abschnitt befasst sich eingehender mit Spaltenwerten bei der Verwendung von MySQL INSERT. Es gibt vier davon:

  • Unicode-Werte.
  • Standardwerte.
  • Autoinkrement verwenden.
  • Werte aus den benutzerdefinierten Variablen.

Unicode-String einfügen

In T-SQL sind Sie damit vertraut, einem Zeichenfolgenwert ein N voranzustellen . Dabei geht der SQL Server davon aus, dass der Wert ein Unicode-Wert ist. In MySQL brauchen Sie das nicht.

Sehen Sie sich das folgende Beispiel an:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES ('김지수'),('김제니'),('박채영'),('ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Es gibt ein paar Punkte, die Sie beachten sollten:

  1. Die Verwendung von NVARCHAR beim Erstellen einer Tabelle in MySQL 8 wird automatisch in VARCHAR geändert.
  2. Es ist nicht erforderlich, dem Unicode-Wert ein N voranzustellen , wie N’김지수’.
  3. Sie müssen den obigen Code ein wenig bearbeiten, damit er erfolgreich in SQL Server ausgeführt wird.

Überprüfen Sie das Ergebnis unten:

Hier ist der entsprechende Code in T-SQL:

CREATE TABLE UnicodeNames
(ID int NOT NULL IDENTITY PRIMARY KEY,
 FullName nvarchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES (N'김지수'),(N'김제니'),(N'박채영'),(N'ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Versuchen Sie, das „N“ aus einem der obigen Unicode-Werte zu entfernen. Der Code wird problemlos ausgeführt, aber Sie überprüfen die Ausgabe unten in SQL Server Management Studio:

Einfügen von Standardwerten in MySQL

Die Spaltenstandardwerte wirken, wenn Sie einen Datensatz einfügen, ohne einen Wert anzugeben. Wir haben das im ersten Beispiel oben verwendet. Hier noch einmal die Spaltendefinition:


`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()

Die Spalte ModifiedDate verwendet standardmäßig das aktuelle Datum und die Uhrzeit auf dem Server. Deshalb haben wir Folgendes getan:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Das Ergebnis ist folgendes:

Sehr übersichtlich und spart Tastenanschläge. Dasselbe Verhalten tritt auch in SQL Server auf.

Wenn Sie es explizit machen möchten, geben Sie in der Zwischenzeit einfach den Spaltennamen mit dem Wert DEFAULT:

an
INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);

Es funktioniert auch in SQL Server mit einer leichten Modifikation.

Es gibt einen weiteren Zeit- und Tastenanschlagsparer. Es hat einen automatisch inkrementierten Spaltenwert.

EINFÜGEN in AUTO_INCREMENT-Spalte

Anstatt den letzten ganzzahligen Wert einer Tabelle zu erhalten und 1 hinzuzufügen, ist es besser, eine Autoincrement-Spalte zu definieren. es ist gut für Primärschlüssel. Das haben wir im Unicode-Tabellenbeispiel gemacht.

Hier ist noch einmal ein Teil davon:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

In der Zwischenzeit verwenden wir in SQL Server das Schlüsselwort IDENTITY anstelle von AUTO_INCREMENT.

Abbildung 2 zeigt das Ergebnis der Definition einer Autoincrement-Spalte. Die ganzzahligen Werte wurden generiert, ohne sie in der INSERT-Anweisung anzugeben.

Verwenden benutzerdefinierter Variablen zum Festlegen von Spaltenwerten

Ein weiterer häufiger Fall für das Einfügen von Datensätzen in T-SQL ist das Anwenden benutzerdefinierter Variablen zum Festlegen von Spaltenwerten. Es ist hilfreich, um Ad-hoc-Skripte und gespeicherte Prozeduren zu erstellen.

Aber zuerst kann das Definieren von Variablen in MySQL mit SET erfolgen. Anders als in SQL Server verwenden Sie DECLARE. Sehen Sie sich das Beispiel an:

SET @stringValue = 'string value';
SET @numericValue = 1287;
SET @booleanValue = TRUE;
SET @dateValue = CURRENT_DATE();

CREATE TABLE IF NOT EXISTS TableDataTypeValues
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 stringValue varchar(50) NOT NULL,
 numericValue int NOT NULL,
 BooleanValue bit not NULL DEFAULT FALSE,
 dateValue date NULL);

INSERT INTO TableDataTypeValues
(stringValue, numericValue, BooleanValue, dateValue)
VALUES (@stringValue, @numericValue, @booleanValue, @dateValue);

Wie Sie oben sehen können, fungieren die Variablen als Ausdrücke, um die Spaltenwerte in der VALUES-Klausel zu füllen.

In temporäre Tabelle in MySQL einfügen

Hier überprüfen wir die Verwendung von MySQL INSERT in temporären Tabellen. T-SQL-Entwickler sind mit dem „#“ vertraut ‘ Symbol vor einem temporären Tabellennamen. In MySQL werden temporäre Tabellen mit CREATE TEMPORARY TABLE table_name erstellt . Es hat kein „# ‘Symbol. Daher kann ein temporärer Tabellenname in den Zeilen Ihres Skripts genauso aussehen wie ein normaler Tabellenname:

CREATE TEMPORARY TABLE tmpkpopgroup
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 GroupName varchar(50) NOT NULL,
 ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP());

INSERT INTO tmpkpopgroup
(GroupName)
VALUES ('BTS'),('SEVENTEEN'),('TWICE'),('MOMOLAND'),('GIRLS GENERATION'),('BLACKPINK'),('OH MY GIRL'),('RED VELVET');

SELECT * FROM tmpkpopgroup
ORDER BY GroupName;

Mit anderen Worten, das Einfügen von Datensätzen in temporäre Tabellen sieht genauso aus wie bei regulären Tabellen.

Hier ist das Ergebnis:

MySQL INSERT…ON DUPLICATE KEY UPDATE – Nicht unterstützte Syntax in T-SQL

Schließlich hat MySQL INSERT Syntaxfälle, die in T-SQL nicht unterstützt werden. Eine davon ist INSERT…ON DUPLICATE KEY UPDATE. Was kann es?

Wenn eine Tabelle einen eindeutigen Schlüssel hat und Sie zufällig einen Wert einfügen, der zu einem Duplikat führt, schlägt INSERT fehl. Wenn Sie jedoch INSERT…ON DUPLICATE KEY UPDATE verwenden, erfolgt stattdessen eine Aktualisierung der vorhandenen Zeile. Der Fehler tritt nicht auf.

Nehmen wir an, wir haben diese Aufzeichnungen in den Personen Tabelle:

Beachten Sie den rot umrandeten Wert des Schiffsregisters und die gesamte Zeile. Die Sache ist, dass wir denselben Datensatz mit ON DUPLICATE KEY UPDATE einfügen werden.

Lassen Sie uns nun die folgende Anweisung auslösen:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT)
ON DUPLICATE KEY UPDATE ShipRegistry = 'NCC-75633';

SELECT * FROM testdatabase.people;

Liegt ein Fehler vor? Lass es uns überprüfen!

Cool, nicht wahr?

Derselbe Effekt tritt auf, wenn Sie dies tun:

UPDATE people 
SET ShipRegistry = 'NCC-75633'
WHERE ID = 5

In der Zwischenzeit können Sie die Absicht in T-SQL wie folgt ausdrücken:

IF EXISTS(SELECT id FROM people WHERE id = 5)
	UPDATE people 
	SET ShipRegistry = 'NCC-75633'
	WHERE ID = 5
ELSE
	INSERT INTO people
	(ID, LastName, FirstName, MiddleName, [Rank], Ship, ShipRegistry, ModifiedDate)
	VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT);

Dasselbe Ergebnis wird auftreten.

Schlussfolgerung

Benjamin Franklin hat einmal gesagt:„Eine Investition in Wissen bringt immer die besten Zinsen.“ Ich hoffe, dass sich dieser Artikel mit der Zeit für Sie auszahlt.

Fassen wir zusammen:

  1. Die grundlegende MySQL-INSERT-Syntax ist fast die gleiche wie in T-SQL, abgesehen vom Fehlen des Schemanamens und der Verwendung von Backticks.
  2. Das Einfügen von Datensätzen in MySQL aus einer anderen Tabelle ist fast dasselbe wie in T-SQL.
  3. Spaltenwerte werden in MySQL INSERT anders gehandhabt. Unicode-Werte sind die bemerkenswertesten. Außerdem unterscheidet sich die Syntax bei der Verwendung von AUTO_INCREMENT.
  4. Das Einfügen von Datensätzen in eine temporäre Tabelle in MySQL hat einen kleinen Unterschied in T-SQL mit dem '# ‘-Symbol.
  5. INSERT…ON DUPLICATE KEY UPDATE sieht gut aus, wenn es darum geht, die Syntax zu kürzen, um doppelte Fehler zu vermeiden.

Ich hoffe, der Artikel hat sich beim Erlernen von MySQL als nützlich für Sie erwiesen. Wenn Ihnen dieser Beitrag gefällt, teilen Sie ihn bitte auf Ihren bevorzugten Social-Media-Plattformen!