開発者は生涯の学生です。できるだけ早く新しい知識を得ることが常に私たちのギグです。 T-SQLキャンプから来ている場合、MySQLを学ぶためのより速い方法は何ですか?多くの場合、構文を比較する必要があります。前回、MySQLでテーブルを作成する方法を学びました。今日の投稿では、さらに一歩進んでいきます。 MySQLINSERTを使用してレコードを挿入します。
どれだけ簡単にできますか?どちらのデータベースプラットフォームもSQLを使用していますが、これらのデータベース製品には、標準のSQL構文にいくつかの追加機能があることがわかっています。 MySQLINSERTも例外ではありません。
したがって、MySQLとSQL Serverの参照を比較することにうんざりしている場合は、今日が幸運な日です。構文をキュレートし、比較を行いました。また、チェックアウトする例もあります。最後に、別の無料のチートシートを用意します。
さて、飛び込む前に、以下のオプトインフォームに記入することで、この記事に関する無料のPDFチートシートを入手することもできます。
[sendpulse-form id =” 12097”]
準備?すばらしい!
MySQL INSERT INTOクエリ構文(テーブル値コンストラクター)
ただし、詳細を説明する前に、いくつかのことを明確にしましょう。
- ここで使用しているMySQLのバージョンは8.0.23で、InnoDBストレージエンジンを搭載しています。
- SQLServerのバージョンは2019年です。
まず、1つのレコードをテーブルに挿入してみましょう。基本的な構文は、SQLServerの構文と似ています。ただし、データベースとスキーマ名を含めず、列名をバッククォートで囲まない場合です。
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');
テーブルの実際の場所の指定は少し異なります。この投稿で示したように、データベースはMySQLのスキーマと同義です。以下の変更されたサンプルを確認してください:
INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');
上記のスキーマ名がないことに気づきましたか?
一方、上記のVALUES句は、テーブル値コンストラクターを形成します。同様に、SQLServerにもその機能があります。
MySQLのテーブルに複数の行を挿入する
複数の行を挿入してみましょう。
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');
上記のコードは、2つのテーブル値コンストラクターを使用して2つのレコードを挿入します。リテラル値の代わりに式を使用することもできます。以下の例では、列ごとにサブクエリを使用しています。
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));
上記のクエリでは、サブクエリは冗長に見えます。ただし、これによりエラーが発生します:
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!
テーブル値コンストラクターは、列リストの各フィールドにリテラルまたは式を想定しています。さらに、前の例のサブクエリは、1つの値を持つ単一の行を返します。これは有効です。ただし、上記のSELECTステートメントは複数の行と列を返すため、エラーが発生します。
もう1つのオプションは、次の例のようにROWキーワードを指定することです。
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');
ただし、INSERTステートメントのROWキーワードはSQLServerではサポートされていません。
別のテーブルからのSELECTを使用したMySQLINSERTINTO
SELECTステートメントを使用してテーブルにレコードを追加できます:
INSERT INTO people2
(ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;
ご覧のとおり、データベース名、スキーマ名、バックティック文字を除いたT-SQLでも同じです。ちなみに、ランクは予約語です。
したがって、ランクという単語を囲むバッククォート文字は必須です。
列リストなしで表現できます。ターゲットテーブルの列配置と同じ順序で列名を指定するだけです。
TRUNCATE TABLE testdatabase.people2;
INSERT INTO testdatabase.people2
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate
FROM people;
SELECT * FROM testdatabase.people2
以下のdbForgeStudioforMySQLからの出力を参照してください。
いいですね?列値の処理のトピックについてさらに詳しく見ていきましょう。
INSERTおよびテーブルの列の値
このセクションでは、MySQLINSERTを使用する際の列の値について詳しく説明します。それらは4つあります:
- Unicode値。
- デフォルト値。
- 自動インクリメントを使用します。
- ユーザー定義変数からの値。
Unicode文字列を挿入
T-SQLでは、文字列値の前に Nを付けることに慣れています。 。これを使用する場合、SQLServerは値がUnicode値であると想定します。 MySQLでは、それは必要ありません。
以下の例を確認してください:
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
注意すべき点がいくつかあります:
- MySQL 8でテーブルを作成する際にNVARCHARを使用すると、自動的にVARCHARに変更されます。
- Unicode値の前にNを付ける必要はありません。 、N’김zippy수’のように。
- SQL Serverで正常に実行するには、上記のコードを少し編集する必要があります。
以下の結果を確認してください:
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
上記のUnicode値の1つから「N」を削除してみてください。コードは正常に実行されますが、SQL ServerManagementStudioで以下の出力を確認してください。
MySQLにデフォルト値を挿入する方法
列のデフォルト値は、値を指定せずにレコードを挿入したときに機能します。上記の最初の例でそれを使用しました。もう一度列の定義を示します:
`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()
列ModifiedDate デフォルトはサーバー上の現在の日付と時刻です。そのため、これを行ったとき:
INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');
結果は次のとおりです:
非常にきちんとしていて、キーストロークを節約できます。これと同じ動作はSQLServerでも発生します。
一方、明示的にしたい場合は、デフォルトの値で列名を指定するだけです:
INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);
SQLServerでもわずかな変更を加えて動作します。
別の時間とキーストロークの節約があります。自動インクリメントの列値があります。
挿入 AUTO_INCREMENT列
テーブルの最後の整数値を取得して1を加算する代わりに、自動インクリメント列を定義することをお勧めします。主キーに適しています。 Unicodeテーブルの例でそれを行いました。
もう一度その一部を示します:
CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
FullName varchar(50) NOT NULL);
一方、SQL Serverでは、AUTO_INCREMENTの代わりにキーワードIDENTITYを使用します。
図2は、自動インクリメント列を定義した結果を示しています。整数値は、INSERTステートメントで指定せずに生成されました。
ユーザー定義変数を使用した列値の設定
T-SQLにレコードを挿入するもう1つの一般的なケースは、ユーザー定義変数を適用して列の値を設定することです。アドホックスクリプトやストアドプロシージャを作成するのに役立ちます。
ただし、最初に、MySQLでの変数の定義はSETを使用して行うことができます。 SQL Serverとは異なり、DECLAREを使用します。例を見てください:
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);
上記のように、変数はVALUES句の列の値を埋めるための式として機能します。
MySQLの一時テーブルに挿入
ここでは、一時テーブルでMySQLINSERTを使用する方法を確認します。 T-SQL開発者は、「#」に精通しています。 一時テーブル名の前にある‘記号。 MySQLでは、一時テーブルはCREATE TEMPORARY TABLE table_nameを使用して作成されます 。 「#」はありません ‘記号。したがって、スクリプトの行の中で、一時的なテーブル名は通常のテーブル名と同じように見える場合があります。
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;
つまり、一時テーブルへのレコードの挿入は、通常のテーブルと同じように見えます。
結果は次のとおりです。
MySQLINSERT…ONDUPLICATEKEYUPDATE –T-SQLでサポートされていない構文
最後に、MySQL INSERTには、T-SQLでサポートされていない構文ケースがあります。それらの1つは、INSERT…ON DUPLICATEKEYUPDATEです。何ができますか?
テーブルに一意のキーがあり、重複の原因となる値を挿入した場合、INSERTは失敗します。ただし、INSERT…ON DUPLICATE KEY UPDATEを使用すると、代わりに既存の行が更新されます。エラーは発生しません。
人々にこれらの記録があるとしましょう テーブル:
赤で囲まれた船籍の値と、その行全体に注目してください。問題は、ON DUPLICATEKEYUPDATEで同じレコードを挿入することです。
それでは、以下のステートメントを実行してみましょう:
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;
エラーはありますか?確認しましょう!
かっこいいですね。
これを行うと同じ効果が発生します:
UPDATE people
SET ShipRegistry = 'NCC-75633'
WHERE ID = 5
一方、T-SQLでは次のように意図を表現できます。
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);
同じ結果が発生します。
結論
ベンジャミン・フランクリンはかつて、「知識への投資は常に最善の利益をもたらす」と述べました。この記事が時間内に報われることを願っています。
要約しましょう:
- 基本的なMySQLINSERT構文は、スキーマ名がなく、バッククォートが使用されていることを除いて、T-SQLでもほぼ同じです。
- 別のテーブルからMySQLにレコードを挿入することは、T-SQLの場合とほとんど同じです。
- MySQL INSERTでは、列の値の処理が異なります。 Unicode値が最も注目に値します。また、AUTO_INCREMENTの使用では構文が異なります。
- MySQLの一時テーブルにレコードを挿入すると、T-SQLで「#」とわずかな違いがあります。 ‘シンボル。
- INSERT…ONDUPLICATEKEYUPDATEは、重複エラーを回避するために構文を短縮するのに適しています。
MySQLを学習しているときに、この記事がお役に立てば幸いです。この投稿が気に入ったら、お気に入りのソーシャルメディアプラットフォームで共有してください!