概要
CloudflareのD1を触っている中で、SQLiteのエラーに遭遇しました。
遭遇したエラーの原因について調査と解決策についてまとめました。
遭遇したエラー
主キーを外部キーに設定したところエラーに遭遇
例えば、下記のようにtable_b
の主キーに外部キー設定を行ったとします。
CREATE TABLE IF NOT EXISTS table_a ( id TEXT, verion TEXT, PRIMARY KEY(id) ); CREATE TABLE IF NOT EXISTS table_b ( id TEXT, name TEXT, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES table_a(id) );
このテーブルでinsert文を実行したところ、下記のようなエラーに遭遇しました。
Uncaught (in promise) Error: D1_ERROR: foreign key mismatch - "table_b" referencing "table_a": SQLITE_ERROR
解決策
上記の記事より「主キーは一意(ユニーク)であるべきだが、外部キーは重複を許すため外部キーを主キーにすべきではない」と回答されている。
そのため、SQLite でも主キーを外部キーにしないように設計し直しました。
まとめ
今回の場合はテーブル設計を修正して対応しましたが、使う技術によっては設計に気をつけるべきだと思いました。