して知られています)では、DELETEステートメントはユーザーが利用できる最も強力な操作の1つです。名前が示すように、DELETE操作は、データベーステーブルから1行以上のデータを不可逆的に削除します。データ管理のこのような基本的な側面であるため、SQLユーザーはDELETEステートメントがどのように機能するかを理解することが重要です。このガイドでは、SQLのDELETE構文を使用して1つ以上のテーブルからデータを削除する方法について説明します。SQLが外部キー制約と競合するDELETE操作を処理する方法についても説明します。前提条件このガイドに従うには、SQLを使用するある種のリレーショナルデータベース管理システム(RDBMS)を実行しているコンピューターが必要です。このガイドの手順と例は、次の環境を使用して検証されています。初期サーバーセットアップガイドで説明されているように、管理者権限を持つ非rootユーザーとUFWで構成されたファイアウォールを備えたUbuntu20.04を実行しているサーバー。20.04にMySQLをインストールする方法で概説されているように、MySQLがサーバーにインストールされて保護されています。このガイドは、ステップ3で説明されているプロセスを使用して作成された非ルートMySQLユーザーで検証されました。注:多くのRDBMSは、独自のSQL実装を使用していることに注意してください。このチュートリアルで概説されているコマンドはほとんどのRDBMSで機能しますが、MySQL以外のシステムでテストした場合、正確な構文または出力が異なる場合があります。データの削除を練習するために使用できるサンプルデータがロードされたデータベースとテーブルも必要です。このガイドで例全体で使用するデータベースと2つのテーブルを作成する方法の詳細については、次のMySQLへの接続とサンプルデータベースの設定セクションをお読みになることをお勧めします。このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルクエリを試すこともできます。Terminal!ボタンをクリックして開始します。インタラクティブターミナルを起動します!MySQLへの接続とサンプルデータベースの設定SQLデータベースシステムがリモートサーバーで実行されている場合は、ローカルマシンからサーバーにSSHで接続します。sammy@your_server_ip次に、MySQLサーバープロンプトを開き、sammyをMySQLユーザーアカウントの名前に置き換えます。このページに埋め込まれたインタラクティブ端末を使用している場合、プロンプトが表示されたときに使用するパスワードはsecretという単語であることに注意してください。-pdeleteDBという名前のデータベースを作成します。deleteDB;データベースが正常に作成されると、次のような出力が表示されます。sec)deleteDBデータベースを選択するには、次のUSEステートメントを実行します。changeddeleteDBデータベースを選択した後、そのデータベース内にいくつかのテーブルを作成します。例として、あなたとあなたの友人の何人かが、メンバーが互いに音楽機器を共有できるクラブを始めたと想像してください。クラブ会員とその備品を追跡しやすくするために、いくつかのテーブルを作成することにしました。最初のテーブルには、次の4つの列があります。memberID:intデータ型で表される各クラブ会員の識別番号。この列は、テーブルの主キーとしても機能しますname:各メンバーの名前。最大30文字のvarcharデータ型を使用して表されます。homeBorough:この列には、各メンバーが住む自治区が格納されます。これもvarcharデータ型を使用して表されますが、最大15文字です。email:各メンバーに連絡できるメールアドレス。最大30文字のvarcharデータ型を使用して表現されます。次の4つの列を持つclubMembersという名前のテーブルを作成します。varchar(30));次の表には、次の列があります。equipmentID:各機器の一意の識別子。この列の値は、intデータ型になります。clubMembersテーブルのmemberID列と同様に、この列はテーブルの主キーとして機能しますequipmentType:各行が表す機器またはツールのタイプ(guitar、mixer、amplifierなど)。これらの値は、最大30文字のvarcharデータ型を使用して表されます。brand:最大30文字のvarcharデータ型を使用して表現された、各機器を製造したブランドownerID:この列には、機器を所有するクラブメンバーのID番号が整数で表示されます。ownerID列が有効なメンバーID番号を表す値のみを保持するようにするために、clubMemberテーブルのmemberID列を参照する外部キー制約を作成できます。外部キー制約は、2つのテーブル間の関係を表現する方法です。外部キーは、それが適用される列の値が、それが参照する列にすでに存在している必要があることを要求することによってこれを行います。次の例では、外部キー制約により、ownerID列に追加された値がmemberID列にすでに存在している必要があります。これらの列とclubEquipmentという名前のこの制約を持つテーブルを作成します。clubMembers(memberID));この例では、外部キー制約の名前fk_ownerIDが提供されていることに注意してください。MySQLは、追加した制約の名前を自動的に生成しますが、後でこの制約を参照する必要がある場合は、ここで名前を定義すると便利です。INTOステートメントを実行して、6行のサンプルデータを含むclubMembersテーブルをロードします。INTOステートメントを実行して、clubEquipmentテーブルに20行のサンプルデータをロードします。5);これで、ガイドの残りの部分に従い、SQLを使用してデータを削除する方法について学習する準備が整いました。単一のテーブルからのデータの削除SQLでデータを削除するための一般的な構文は、次のようになります。conditions_apply;警告:この構文の重要な部分はWHERE句です。これにより、削除するデータの行を正確に指定できます。table_name;のようなコマンドは正しく実行されますが、テーブルからデータのすべての行が削除されます。DELETE操作が成功すると元に戻せないことに注意してください。削除するデータを正確に知らずに実行すると、誤って間違ったレコードを削除する可能性があります。誤って間違ったデータを削除しないようにする1つの方法は、最初にSELECTクエリを発行して、DELETE操作のWHERE句によって返されるデータを確認することです。Korgiというブランドの音楽機器に関連するレコードをすべて削除したいとします。安全のために、最初にクエリを記述して、brand列にKorgiと表示されている機器レコードを正確に確認することにします。テーブル内のどの楽器がコルグによって製造されているかを見つけるには、次のクエリを実行できます。INTO操作とは異なり、DELETE操作では、データの行全体を削除することを目的としているため、個々の列を指定できないことに注意してください。この動作を模倣するために、このクエリはSELECTキーワードの後にアスタリスク(*)を付けます。これはSQLの省略形であり、「すべての列」を表します。'Korgi';このクエリは、clubEquipmentテーブルからすべての列を返しますが、brand列に値Korgiが含まれている行のみを返します。sec)この行を削除するには、前のSELECTステートメントと同じFROMおよびWHERE句を持つDELETE操作を実行します。sec)この出力は、DELETE操作が単一の行にのみ影響したことを示しています。複数の行を返すWHERE句を使用すると、複数行のデータを削除できます。次のSELECTクエリは、equipmentType列にelectricという単語が含まれているclubEquipmentテーブルのすべてのレコードを返します。*をDELETEに置き換えます。使用して、より詳細な結果セットを返したり削除したりすることもできます。サブクエリは完全なクエリ操作です。SELECTで始まり、FROM句を含むSQLステートメント)は、周囲の操作自体のFROM句に続いて、別の操作に埋め込まれます。名前が「L」で始まるメンバーが所有するclubEquipmentテーブルにリストされている機器を削除したいとします。最初に、次のようなステートメントを使用してこのデータをクエリできます。'L%');この操作は、clubEquipmentテーブルからすべての行を返します。このテーブルのownerID列は、4行目から始まるサブクエリによって返される値に表示されます。whosename`値を返します。sec)次に、次のDELETEステートメントを使用して、このデータを削除できます。sec)複数のテーブルからのデータの削除JOIN句を含めることにより、1回の操作で複数のテーブルからデータを削除できます。JOIN句は、2つ以上のテーブルの行を1つのクエリ結果に結合するために使用されます。これを行うには、テーブル間で関連する列を見つけ、出力で結果を適切に並べ替えます。JOIN句を含むDELETE操作の構文は次のようになります。conditions_apply;JOIN句は複数のテーブルの内容を比較するため、この構文例では、列の名前の前にテーブルの名前とピリオドを付けて、各列を選択するテーブルを指定します。これは、完全修飾列参照として知られています。前の例で行ったように単一のテーブルからのみ選択する場合は必要ありませんが、どの操作でもこのように列を選択するテーブルを指定できます。JOIN句を使用してデータを削除することを説明するために、クラブが音楽機器のメンバーが共有できるブランドを制限することを決定したとします。次のステートメントを実行して、prohibitedBrandsという名前のテーブルを作成します。このテーブルには、クラブで受け入れられなくなったブランドを一覧表示します。このテーブルには2つの列しかなく、どちらもvarcharデータ型を使用して、各ブランドの名前とブランドが運営されている国を保持しています。varchar(30));次に、この新しいテーブルにいくつかのサンプルデータをロードします。'Japan');その後、クラブは、ブランドがprohibitedBrandsテーブルに表示され、米国を拠点とするclubEquipmentテーブルから機器のレコードを削除することを決定します。次のSELECTステートメントのような操作で、このデータを照会できます。この操作は、clubEquipmentテーブルとprohibitedBrandsテーブルを結合し、brand列とbrandName列が共通の値を共有する行のみを返します。WHERE句は、homeCountry列にUSAが値として含まれていないブランドを除外することにより、この結果セットをさらに改良します。sec)これが私たちが探しているすべての情報です。clubEquipmentテーブルにも表示されるprohibitedBrandsテーブルの各USAベースのブランド。*をDELETEに置き換えます。sec)この出力は、操作によって4行のデータが削除されたことを示しています。clubEquipmentから2行、prohibitedBrandsから2行です。clubEquipmentテーブルからレコードを削除し、prohibitedBrandsテーブルのすべてのレコードを維持したい場合は、DELETEの後にclubEquipmentのみをリストします。キーワード、およびその逆。外部キーの変更DELETEの動作デフォルトでは、外部キーとの競合を引き起こすDELETEステートメントは失敗します。MySQLへの接続と前提条件のサンプルデータベースセクションのセットアップから、clubEquipmentテーブルのownerID列がownerID列。ownerID列に入力された値は、memberID列にすでに存在している必要があります。memberID値がownerID列のどこかで使用されているclubMembersテーブルからデータの行を削除しようとすると、エラーが発生します。fails最初に、親テーブル(clubMembers)に外部キー値が存在する子テーブル(この例ではclubEquipment)の行を削除することで、このエラーを回避できます。既存の外部キー制約をDELETE操作を異なる方法で処理する制約に置き換えることでこの動作を変更できます。注:すべてのデータベース管理システムまたはエンジンで、次の段落で概説するように、既存のテーブルに制約を追加または削除できるわけではありません。MySQL以外のRDBMSを使用している場合は、その公式ドキュメントを参照して、制約を管理するための制限を理解する必要があります。TABLEステートメントで制約を削除する必要があります。TABLEステートメントで、テーブルの外部キー制約の名前としてfk_ownerIDを定義したことを思い出してください。0その後、特定のユースケースに適した方法でDELETE操作を処理するように構成された新しい外部キー制約を作成します。外部キーに違反するDELETEステートメントを禁止するデフォルト設定の他に、ほとんどのRDBMSで使用可能な他の2つのオプションがあります。NULL:このオプションを使用すると、親テーブルからレコードを削除し、それらをNULLとして参照する子テーブルの値をリセットできます。CASCADE:親テーブルの行を削除すると、このオプションにより、SQLは子テーブルでその行を参照するすべてのレコードを自動的に削除します。NULLは意味がありません。メンバーがクラブを離れ、そのレコードがclubMembersテーブルから削除された場合、残りのメンバーはその機器を使用できなくなるため、clubEquipmentテーブルから削除する必要があります。CASCADEオプションは、私たちの目的にとってより理にかなっています。TABLEステートメントを実行します。CASCADEオプションが含まれます。0この出力は、clubEquipmentテーブルの残りの7行すべてに影響を与えたことを示しています。TABLEステートメントでこの動作を最初から定義できます。CASCADE);その後、clubMembersテーブルから任意のレコードを削除できるようになり、それを参照するclubEquipmentテーブルのすべての行も削除されます。sec)この出力は、1つの行にのみ影響することを示していますが、clubEquipmentテーブルのownerID値を6としてリストしている機器レコードも削除されます。結論このガイドを読むことで、DELETEステートメントを使用して1つ以上のテーブルからデータを削除する方法を学びました。SQLが外部キー制約と競合するDELETE操作を処理する方法、およびそのデフォルトの動作を変更する方法についても学びました。ここで概説するコマンドは、SQLを使用するすべてのデータベース管理システムで機能するはずです。すべてのSQLデータベースは独自の言語実装を使用しているため、DELETEステートメントの処理方法と使用可能なオプションの詳細については、DBMSの公式ドキュメントを参照してください。SQLの操作について詳しく知りたい場合は、SQLの使用方法に関するこのシリーズの他のチュートリアルを確認することをお勧めします。Joseモバイルバージョンに。