MySQLへの道のりは、CREATE TABLEから始まり、その後にINSERTが続きます。今日は、MySQLDELETEステートメントに進んでいます。これは、MySQLUPDATEステートメントとほぼ同じくらい一般的です。
T-SQL DELETEに精通しているため、MySQL構文を使用して生産性を高めることが目標です。これらのDELETEステートメントには小さな違いがありますが、処理できないものはありません。始めましょう。
サンプルデータの準備
最も一般的なニーズの1つは、MySQLの行削除タスクです。ここで検討しますが、最初に作業領域を準備する必要があります。レコードを削除するには、最初にレコードを用意する必要があります。それでは、MySQLでデータベースを構築しましょう。
80年代のテレビシリーズに懐かしいので、サンプルデータにはマクガイバーとクォンタムリープのエピソードを使用します。データを新しいデータベースにインポートするための最終的なExcelファイルがあります。このファイルには、 Titlesという名前の2つのシートがあります およびエピソード 。両方を2つのテーブルにインポートします。
データをインポートする前に、 tv-seriesという名前のデータベースを作成する必要があります。 タイトルと呼ばれる2つのテーブルがあります およびエピソード 。 MySQLのテーブル作成ジョブは、適切なツールを使用した基本的なものです。私はdbForgeStudiofor MySQLを使用しています。次の図1と図2は、そのツールによって表示されるデータベースのビジュアルテーブル構造を示しています。
テーブルのスクリプトは次のとおりです。
CREATE DATABASE IF NOT EXISTS `tv-series`;
USE `tv-series`;
CREATE TABLE `tv-series`.titles (
TitleID int NOT NULL AUTO_INCREMENT,
Title varchar(50) DEFAULT NULL,
`From` int DEFAULT NULL,
`To` int DEFAULT NULL,
PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE `tv-series`.episodes (
EpisodeID int NOT NULL AUTO_INCREMENT,
TitleID int DEFAULT NULL,
EpisodeTitle varchar(100) DEFAULT NULL,
AirDate date DEFAULT NULL,
Synopsis text DEFAULT NULL,
EpisodeNo int NOT NULL,
SeasonNo int NOT NULL,
PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);
データベースとテーブルを作成したら、Excelファイルからデータをインポートできます。
ExcelファイルをMySQLにインポートするために使用した最も簡単で強力なツールは、dbForge StudioforMySQLです。特に、ターゲットテーブルの主キーとして新しい列が追加されたことに感謝します。また、自動検出の日付と時刻の形式は優れたサポートです。テキストデータ型の日付と奇妙な日付形式を手間をかけずに変換します。
MySQL構文をT-SQLと比較するため、ExcelファイルをSQLServerの新しいデータベースにインポートすることもできます。次に、MySQLと同じデータベース名とテーブル名を使用します。
詳細情報
- dbForge StudioforMySQLのMySQLインポートおよびエクスポートツール
1。 テーブルからすべてのデータを削除
まず、最も簡単です。 エピソードをバックアップしてみましょう テーブルを作成してから、バックアップのレコードを削除します。さまざまな状況で実行する必要がある可能性のある標準のMySQLのすべての行の削除操作を実行します。
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
ご覧のとおり、構文はT-SQLの場合と同じです。クエリはepisodes_backupのすべてのレコードを削除します テーブル。
いくつかの注意事項:
- 複数の行またはすべての行を削除する必要がある場合、TRUNCATE TABLEは、WHERE句を指定しないDELETEよりも高速です。これは、MySQLとSQLServerの両方に当てはまります。
- MySQL Workbenchで上記のコードを実行すると、エラーコード1175がトリガーされます 。 MySQL Workbenchはデフォルトでセーフモード更新に設定されているため、許可されていません。したがって、WHERE句のないテーブルの削除または更新は許可されていません。ただし、設定でこの機能を無効にすることができます 。
2。 MySQLでWHEREを削除
2番目のポイントは、条件でDELETEを使用すること、つまりMySQLのselect操作からの削除についてです。このようにして、1つのステートメントで1つ以上のレコードを削除できますが、すべてではありません。たとえば、最初の行または他の特定の行を削除します。 SQLでレコードの重複を回避する方法を探している場合はどうなりますか? WHERE条件を使用することが解決策になります。
繰り返しますが、構文はT-SQLでも同じです:
-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;
-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);
ここで特別なことは何もありませんが、次のセクションは異なります。
3。 MySQL DELETE LIMIT
制限しますか?制限は何ですか?
LIMITは、T-SQLのTOPと同等です。 DELETEの例を示す前に、削除するレコードをクエリしてみましょう。以下のコードを確認してください:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
これがあなたの限界です。図3に示すように、dbForge StudioforMySQLのカードビューのレコードは2つになります。
それでは、それらを削除してみましょう。以下の例を見てください:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
2つのエピソードを削除する前に、MySQLは1987年のすべてのエピソードを照会しました。次に、それらをシーズン番号とエピソード番号に分類しました。最後に、結果を2レコードに制限しました。重複する行を削除する必要がある場合にも適した方法です。これにより、削除の条件を指定し、必要なものを削除しないようにすることができます(ただし、バックアップを作成すると、データの安全性が確保されます)。
T-SQLに相当するものはありますか?これでうまくいくと思いますか?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
上記のコードをSQLServerManagement Studioに貼り付けると、ORDERBY句に波線が表示されます。ただし、TOPは許可されています。
ただし、ORDER BY句を削除すると、クエリによって2つのランダムなレコードが削除されます。最後に、上記のコードは期待どおりに実行されません。
MySQLと同じ結果を得るには、次のコードが必要です。
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
T-SQLの方がMySQLよりも少し長くなります。しかし、それだけではありません。
4。 JOINを使用したMySQLDELETE
レコードを削除する別の方法は、削除するレコードをフィルタリングするJOINで使用することです。多くのユーザーが定義しているように、これはMySQLの削除参加タスクです。テーブルエイリアスを使用していない場合でも、見た目は変わりません。以下の例を確認してください:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
これはT-SQLでも機能します。ただし、次のようなテーブルエイリアスを使用する場合:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQLはエラーをスローします。正しい構文は次のとおりです。
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
違いに注意してください!
5。 MySQLでサブクエリを削除
最後に、サブクエリを使用してみます。これは、削除するレコードをフィルタリングする別の方法です。すでに前の例を見ましたが、もう一度見てみましょう:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
これは、T-SQLで完全に有効な構文です。しかし、それはMySQLで機能しますか?少し変更しましょう:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
おっと!壁にぶつかったようです。 MySQLの内容は次のとおりです:
このバージョンのMySQLは、「LIMIT&IN / ALL / ANY/SOMEサブクエリ」をまだサポートしていません
LIMITキーワードを削除するとどうなりますか?別のエラーが発生します:
FROM句で更新のターゲットテーブル「エピソード」を指定することはできません。
回避策はありますか?コードをネストされたサブクエリに変更すると、問題なく実行されます:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 5) AS T)
それはそれをする必要があります。しかし、もっと賢明な例を見てみましょう:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
さて、これらの例の大きな問題は何ですか?見てみましょう:
- MySQLは、LIMITキーワードを使用したサブクエリフィルターを使用したDELETEステートメントを受け入れません。まだです。
- MySQLは、それをフィルタリングするサブクエリテーブルと同じターゲットテーブルからのDELETEを受け入れません。
[sendpulse-form id =” 13566”]
結論
ここまでは順調ですね。 MySQLとT-SQLのDELETE構文の比較は3つあります。将来的には、3回目の記事もお役に立てば幸いです。
この投稿では、削除時のMySQL構文に焦点を当てました
- すべての記録
- WHERE句を含む1つ以上のレコード
- LIMITを使用する
- JOINを使用する
- サブクエリの使用。
MySQLの列削除タスクのパフォーマンスの方法を簡単に確認したり、条件ごとに任意の行、複数の行、および特定のレコードを削除したりできます。
この投稿が気に入った場合は、お気に入りのソーシャルメディアプラットフォームで自由に共有してください。下記のコメントセクションでご意見をお聞かせください。