SQLiteで、テーブル作成時に外部キー制約を付けても制約を無視してデータが追加されていた。この解決策をメモしておく。
外部キー制約とは
外部キー制約(FOREIGN KEY制約)は、参照制約ともいい、テーブル間でのデータの整合性を保つための制約。
対象の列に格納することができる値を他のテーブルの特定列のみに限定できる制約。テーブル作成時に以下のように指定できる。
問題
テーブル作成時に外部キー制約を付けても制約を無視してデータが追加された。
解決策
SQLiteでは、互換性の観点から外部キー制約はデフォルトで無効になっているらしい。
そのため、データベースに接続する度に外部キー制約を有効にする必要がある。
次のコマンドで確認してみると外部キー制約が無効になっていた。
sqlite> PRAGMA foreign_keys;
0
コマンドラインからデータベースを操作する場合に外部キー制約を有効にするには以下で有効化する。
# 有効化
sqlite> PRAGMA foreign_keys= true;
# 確認
sqlite> PRAGMA foreign_keys;
1
ここで、true
の部分はON
や1
でも有効化することができる。
Pythonから操作する場合は、データベース接続後に外部キー制約を有効化する必要がある。
Python
with sqlite3.connect(database_name) as connection:
cursor = connection.cursor()
# 外部キーを有効化
cursor.execute("PRAGMA foreign_keys = true")
<処理内容>
以上のように外部キー制約を有効化することで、制約に違反した際にはエラーが表示されるようになり、データが追加されなくなった。
エラー表示
sqlite3.IntegrityError: FOREIGN KEY constraint failed