0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[SQLite]外部キー制約を有効にする方法

Posted at

SQLiteで、テーブル作成時に外部キー制約を付けても制約を無視してデータが追加されていた。この解決策をメモしておく。

外部キー制約とは

外部キー制約(FOREIGN KEY制約)は、参照制約ともいい、テーブル間でのデータの整合性を保つための制約。
対象の列に格納することができる値を他のテーブルの特定列のみに限定できる制約。テーブル作成時に以下のように指定できる。

問題

テーブル作成時に外部キー制約を付けても制約を無視してデータが追加された。

解決策

SQLiteでは、互換性の観点から外部キー制約はデフォルトで無効になっているらしい。
そのため、データベースに接続する度に外部キー制約を有効にする必要がある。
次のコマンドで確認してみると外部キー制約が無効になっていた。

sqlite> PRAGMA foreign_keys;
0

コマンドラインからデータベースを操作する場合に外部キー制約を有効にするには以下で有効化する。

# 有効化
sqlite> PRAGMA foreign_keys= true;
# 確認
sqlite> PRAGMA foreign_keys;       
1

ここで、trueの部分はON1でも有効化することができる。
Pythonから操作する場合は、データベース接続後に外部キー制約を有効化する必要がある。

Python
with sqlite3.connect(database_name) as connection:
    cursor = connection.cursor()
    # 外部キーを有効化
    cursor.execute("PRAGMA foreign_keys = true")

    <処理内容>

以上のように外部キー制約を有効化することで、制約に違反した際にはエラーが表示されるようになり、データが追加されなくなった。

エラー表示
sqlite3.IntegrityError: FOREIGN KEY constraint failed
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?