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で外部キーを削除する方法を参照してください。