【问题标题】:delete associated records in Supabase删除 Supabase 中的关联记录
【发布时间】:2021-11-14 00:17:32
【问题描述】:
使用 Supabase 时,是否有一种干净/简单的方法可以删除所有关联的记录以及一个项目?假设我有帖子,一个帖子可以有很多评论。当我删除帖子时,我也想删除评论。
基本上类似于 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.
【问题讨论】:
标签:
javascript
sql
supabase
supabase-database
【解决方案1】:
是的,有!
魔法不是在您删除数据时发生,而是在您第一次创建 cmets 表时发生。它也不是 Supabase 功能,而是 postgres 功能。
当你创建一个外键约束时,你可以设置一个delete cascade 选项来告诉表删除任何相关数据。
例如,您可以像这样创建一个 cmets 表:
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_id 和user_id 定义中的delete cascade 关键字。如果相关帖子或用户被删除,添加这些将删除评论条目。
目前,在 Supabase UI 中无法使用delete cascade 选项创建列,因此您必须使用 SQL 创建此类表。
另外,如果您已经有一个表并且想要添加此delete cascade 选项,则必须删除外键约束并使用delete cascade 选项重新添加它。您可以了解更多关于如何将 delete cascade 添加到现有表 here 的信息,但如果您的应用程序未投入生产,则删除该表并从头开始重新创建它可能会更容易!