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

SQLite DROP TABLE

    SQLiteでは、DROP TABLEを使用してテーブルを削除できます ステートメント。

    オプションで、IF EXISTSを追加できます テーブルが存在しない場合に発生する可能性のあるエラーを抑制する句。

    また、テーブルが外部キーによって参照されている場合は、注意すべき点がいくつかあります。

    SQLiteでテーブルをドロップする最も簡単な方法を示す例を次に示します。

    DROP TABLE t1;

    これにより、t1というテーブルが削除されます 。

    オプションで、テーブル名の前にスキーマ名を付けることができます。

    IF EXISTSの使用 条項

    IF EXISTSを使用できます テーブルが存在しない場合に発生する可能性のあるエラーを抑制する句。

    DROP TABLE IF EXISTS t2;

    IF EXISTSを削除した場合 句を実行し、それを再度実行すると、エラーが発生します。

    例:

    DROP TABLE t2;

    結果:

    Error: no such table: t2 

    外部キーとビューの依存関係

    SQLiteはCASCADEをサポートしていません およびRESTRICT キーワード。SQL標準に含まれており、他のRDBMS(PostgreSQLなど)でサポートされています。これらのキーワードは、ターゲットテーブルに依存関係(テーブルを参照するビューや外部キーなど)がある場合の処理​​を指定するように設計されています。

    SQLiteはこれらのキーワードをサポートしていないため、テーブルを削除しようとしたときにSQLiteがビューと外部キーを処理する方法は次のとおりです。

    SQLiteは依存するビューを無視します。つまり、それを参照するビューがある場合でも、先に進んでテーブルを削除します。

    外部キーについては…

    まず、SQLiteでは外部キーがデフォルトで無効になっています。したがって、それらを有効にしない限り、ターゲットテーブルを参照する外部キーはターゲットテーブルの削除に影響を与えません。つまり、テーブルは削除されます。

    セッションで外部キーが有効になっている場合、その外部キーに違反するデータがある場合にのみ、テーブルの削除が防止されます。子テーブルにデータが含まれていない場合、親テーブルはエラーなしで削除されます。子テーブルにデータ(おそらく親テーブルの主キーを参照するデータを含む)が含まれている場合、エラーが発生し、テーブルは削除されません。

    このように:

    PRAGMA foreign_keys = ON;
    DROP TABLE t1;

    結果:

    Error: FOREIGN KEY constraint failed 

    このように機能する理由は、SQLiteが暗黙のDELETE FROMを実行するためです。 テーブルを削除する前の操作。 DELETE FROMの場合 操作の結果、外部キー違反が発生し、エラーが発生します。ただし、テーブルにデータがない場合は、DELETE FROM 操作によって外部キー違反が発生することはなく、テーブルを削除できます。

    つまり、DROP TABLEではありません。 外部キー違反を引き起こす操作は、暗黙のDELETE FROMです。 操作。

    外部キーがON DELETE CASCADEを使用する場合

    ただし、外部キー制約がON DELETE CASCADEで定義されている場合 の場合、親テーブルは削除され、そのテーブルの主キー列を参照する行はすべて子テーブルから削除されます。

    これが例です。

    テーブルを作成してデータを挿入します:

    CREATE TABLE t11 (
        c1 integer  PRIMARY KEY AUTOINCREMENT
        );
    CREATE TABLE t12 (
        c1 integer  PRIMARY KEY AUTOINCREMENT, 
        c2 integer REFERENCES t11 (c1) ON DELETE CASCADE
        );
    INSERT INTO t11 VALUES (1);
    INSERT INTO t12 VALUES (1, 1);
    

    データを選択:

    sqlite> SELECT * FROM t11;
    c1
    --
    1 
    sqlite> SELECT * FROM t12;
    c1  c2
    --  --
    1   1 

    親テーブルを削除し、すべてのテーブルを確認します:

    sqlite> DROP TABLE t11;
    sqlite> .tables
    t12

    t11であることがわかります 存在しなくなりましたが、t12 まだ存在しています。

    t12の外部キーを確認してください :

    sqlite> PRAGMA foreign_key_list(t12);
    id  seq  table  from  to  on_update  on_delete  match
    --  ---  -----  ----  --  ---------  ---------  -----
    0   0    t11    c2    c1  NO ACTION  CASCADE    NONE 

    はい、それはまだ存在しており、ON DELETE CASCADEがあることを確認できます 。

    t12からデータを選択します :

    sqlite> SELECT * FROM t12;
    sqlite> 

    行は返されません。これは、ON DELETE CASCADEが原因です。 外部キーのオプションにより、親テーブル(t11 )が削除されました(より正確には、暗黙のDELETE FROMを介してデータが削除された場合) ドロップされる前の操作)。

    外部キーの削除

    SQLiteは、実際には外部キーの削除をサポートしていません。通常、SQLでは、ALTER TABLEを使用して外部キーを削除します。 ステートメントですが、SQLiteのALTER TABLE 実装では、制約を削除することはできません。

    ただし、この状況に対処する方法があります。例については、SQLiteで外部キーを削除する方法を参照してください。


    1. オブジェクト[INFORMATION_SCHEMA]。[TABLES]への未解決の参照

    2. SQL Serverエージェント(T-SQL)でスケジュールのリストを取得する4つの方法

    3. SQLは、列の最大値を持つ行のみを選択します

    4. B+treeとHashを比較したデータベースのインデックス作成