首页 > 解决方案 > 删除 Supabase 中的关联记录

问题描述

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

基本上就像dependend: :destroy在 Rails 中的东西。

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.

标签: javascriptsqlsupabasesupabase-database

解决方案


就在这里!

魔法不是在您删除数据时发生,而是在您第一次创建评论表时发生。它也不是 Supabase 功能,而是 postgres 功能。

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

例如,您可以像这样创建一个评论表:

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
);

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

目前,没有办法delete cascade在 Supabase UI 中创建带有选项的列,因此您必须使用 SQL 创建这样的表。

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


推荐阅读