删除 Supabase 中的关联记录

delete associated records in Supabase

使用 Supabase 时,有没有一种干净/简单的方法可以删除所有关联记录以及一个项目?假设我有 Posts 而 Post 可以有很多评论。当我删除 Post 时,我也想删除评论。

基本上类似于 Rails 中的 dependend: :destroy

const { data, error } = await supabase
  .from('posts')
  .delete()
  .match({ id: 123 })
  .options({ destroyDependent: true }) // set some option that tells Supabase to delete all associated records as well.

是的,有!

奇迹不是在您删除数据时发生的,而是在您首次创建评论时发生的 table。它也不是 Supabase 的功能,而是 postgres 的功能。

创建外键约束时,可以设置一个delete cascade选项来告诉table删除任何相关数据。

例如,您可以这样创建评论 table:

create table if not exists public.comments (
    id uuid not null primary key DEFAULT uuid_generate_v4 (),
    post_id uuid references public.posts on delete cascade not null,
    user_id uuid references public.users on delete cascade not null,
    created_at timestamp with time zone default timezone('utc' :: text, now()) not null,
    text varchar(320) not null
);

注意 post_iduser_id 定义中的 delete cascade 关键字。如果相关 post 或用户被删除,添加这些将删除评论条目。

目前,无法在 Supabase UI 中使用 delete cascade 选项创建列,因此您必须使用 SQL 创建这样的 table。

此外,如果您已经有一个 table 并想添加此 delete cascade 选项,您将必须删除外键约束并使用 delete cascade 重新添加它选项。您可以了解有关如何将 delete cascade 添加到现有 table here 的更多信息,但如果您的应用尚未投入生产,则删除 table 可能更容易并从头开始重新创建它!