SQLiteで主キーを外部キーに設定するとエラーに遭遇した

概要

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

解決策

stackoverflow.com

上記の記事より「主キーは一意(ユニーク)であるべきだが、外部キーは重複を許すため外部キーを主キーにすべきではない」と回答されている。
そのため、SQLite でも主キーを外部キーにしないように設計し直しました。

まとめ

今回の場合はテーブル設計を修正して対応しましたが、使う技術によっては設計に気をつけるべきだと思いました。