🖇️

because it does not have a replica identity and publishes deletes

2024/04/25に公開

Tips💡

Supabaseのテーブルを2個作成したときに、リレーションをつけてるのだがそれが原因でダミーデータ削除するクエリが実行できなかった!

Error Code

ERROR: 55000: cannot delete from table "notification" because it does not have a replica identity and publishes deletes HINT: To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE.

delete from notification where id = '5ab9277f-5e8b-4cfe-8304-a574f9c38b7f';

対象方法を Github Copilotに聞いてみた

このエラーは、PostgreSQLの複製アイデンティティ設定が原因で発生しています。複製アイデンティティは、レプリケーションやロジカルデコーディングの際に、行の一意性を確認するために使用されます。

デフォルトでは、PostgreSQLのテーブルはREPLICA IDENTITY DEFAULTが設定されており、主キーが複製アイデンティティとして使用されます。主キーがないテーブルでは、DELETE操作はロジカルデコーディングによって追跡できないため、このようなエラーが発生します。

この問題を解決するには、テーブルに主キーを追加するか、REPLICA IDENTITY FULLを設定してテーブルの全ての列を複製アイデンティティとして使用するように設定します。

以下に、REPLICA IDENTITY FULLを設定するSQLコマンドの例を示します:

ALTER TABLE notification REPLICA IDENTITY FULL;
delete from notification where id = '5ab9277f-5e8b-4cfe-8304-a574f9c38b7f';

削除することができた💦

最後に

テーブルにリレーションをつけることによって発生するエラーで時々悩まされます。テーブル1個ならDELETE文を実行すれば削除できるのですが、リレーションがあると主キーがないとダメとか、許可する設定が必要でした。今まで、 Firestoreばかり使ってたので、SQLの知識が必要ない場面が多かったので、 Supabaseを使うとよくこの手のエラーに詰まります。
AIを活用すればアシスタント機能やエラーを解析して、対象方法を教えてくれますので解決することはできました。

Discussion