この記事には、基本的なSQL DELETE
が含まれています 初心者がデータベーステーブルからデータを削除するために使用できるステートメント。
単一の行を削除する
SQL DELETE
の基本的な例を次に示します。 ステートメント。
DELETE FROM Owners
WHERE OwnerId = 5;
この場合、OwnerId
がある行を削除します 列の値は4
。
DELETE
ステートメントはDELETE FROM
で始まります 、その後にテーブル名(つまり、削除するデータを含むテーブル)が続きます。
一部のデータベース管理システム(DBMS)では、FROM
キーワードはオプションですが、移植性を高めるためにキーワードを含めることをお勧めします(別のDBMSで同じコードを実行する必要がある場合)。
常にWHERE
を含める必要があります テーブルからすべての行を削除する場合を除いて、句。
はい、あなたはその権利を読みます。 WHERE
を省略します 句はテーブル内のすべての行を削除します。
ほとんどのDBMSには、DELETE
で使用できる他のさまざまなオプションがあります。 ステートメントですが、ここにリストされているものが最も一般的に使用されているものです。
DELETE
に注意してください ステートメントは行全体を削除します。行内の個々の列の値を削除することはできません。これを行うには、SQL UPDATE
を使用します ステートメント。
例
この例では、テーブルからデータを削除します。
まず、テーブルの内容を見てみましょう。
SELECT * FROM Owners;
結果:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
OK、所有者番号5を削除してから、テーブルをもう一度選択します。
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners;
結果:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
指定どおりに最後の行が削除されたことがわかります。
外部キー
別のテーブルの外部キーによって参照されているデータを削除しようとすると、エラーが発生する可能性があります。これは、データを削除しようとしているテーブルがリレーションシップの親テーブルであるためです。外部キーを持つテーブル(子テーブル)は、親テーブルのデータ(つまり、削除しようとしているデータ)に依存しています。
エラーが発生するかどうかは、外部キーがどのように構成されているかによって異なります。ほとんどのDBMSは、この状況に対処するためのさまざまなオプションをサポートしています。このようなオプションには、エラーの発生、外部キーテーブルへの削除のカスケード(つまり、子テーブルからの行の削除)、外部キーのNULL
への設定が含まれます。 、またはデフォルト値に設定します。
外部キーによって参照されている行を削除しようとする例を次に示します。
DELETE FROM Owners
WHERE OwnerId = 3;
結果:
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
この場合、エラーが発生し、行は削除されませんでした。
この例では、Owners.OwnerId
列はこのテーブルの主キーです。 Pets
と呼ばれる別のテーブル OwnerId
があります この主キー列を参照する列。この場合、所有者番号3を参照する行が少なくとも1つあります。
この行を本当に削除したい場合は、子テーブルのデータを更新して、この所有者を指す行がないようにする必要があります。それか、主キーで削除操作が発生したときに別のオプションを使用するように外部キーを変更します。外部キーを変更することは、何をする必要があるかによっては、望ましくないオプションになる可能性があります。 DBMSによっては、既存のキーを削除して再作成する必要がある場合もあります。
いずれにせよ、このエラーは、この行を削除した場合に発生する問題を警告するため、良いことです。参照整合性を強化するのに役立ちます。
注意! WHERE
を忘れる 条項
DELETE
ステートメントは非常に危険なステートメントになる可能性があります。 WHERE
を省略した場合 条項、すべてを削除します テーブルの行。
幸い、リレーションシップの親テーブルからデータを削除しようとすると、外部キー制約によって保存される可能性があります。
しかし、そうでない場合はどうでしょうか。削除ステートメントによってエラーが発生しなかった場合はどうなりますか?
確認してみましょう!
別のDELETE
を実行してみましょう ステートメントですが、今回はWHERE
を含めるのを忘れます 句。また、今回は、リレーションシップの親ではないテーブルに対して実行します。
まず、表の内容を見てみましょう。
SELECT * FROM Pets;
結果:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
はい、8匹のペットを飼っています。実際には、3匹のペットが所有者番号3(前の例で削除しようとした所有者)によって所有されていることがわかります。これがエラーが発生した理由です。
とにかく、先に進んでDELETE
を実行しましょう WHERE
のないステートメント 句を入力してから、テーブルをもう一度確認してください
DELETE FROM Pets;
SELECT * FROM Pets;
結果:
(8 rows affected) (0 rows affected)
(8 rows affected)
一部は、8行が削除されたことを意味します。
(0 rows affected)
partは、行が選択されていないことを意味します(テーブルに行がないため。
おっと!
実際にテーブル内のすべての行を削除する必要がある場合があります。テーブルのサイズによっては、このステートメントだけで十分です。
より大きなテーブルを削除する必要がある場合は、TRUNCATE TABLE
もあります 、これは、個々の行の削除をログに記録せずに、テーブルまたはテーブルの指定されたパーティションからすべての行を削除します(DELETE
ステートメントはこれらの削除をログに記録します。
したがって、TRUNCATE TABLE
より高速で、使用するシステムおよびトランザクションログリソースが少なくなります。
TRUNCATE TABLE
の使用例 :
TRUNCATE TABLE Owners;
子行がない場合でも、テーブルが外部キー制約によって参照されている場合、これは機能しない可能性があることに注意してください。このような場合、DELETE
代わりに機能する可能性があります。