sql >> データベース >  >> RDS >> Database

初心者のためのSQLDELETE

    この記事には、基本的な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 代わりに機能する可能性があります。


    1. Spotlightクラウドセキュリティ機能-リテラルを削除

    2. MySQLを使用して2つの日付の間でクエリを実行するにはどうすればよいですか?

    3. CURRENT_DATEの例– MySQL

    4. ODP.NET2.111とODP.NET4.112を同じマシンに並べてインストールし、両方が同じデータベースサーバーを指すようにする方法