删除Supabase中的关联记录

Sve*_*ies 8 javascript sql supabase supabase-database

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

基本上就像dependend: :destroyRails 中的东西。

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.
Run Code Online (Sandbox Code Playgroud)

dsh*_*tjr 17

就在这里!

\n

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

\n

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

\n

例如,您可以创建如下评论表:

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

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

\n

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

\n

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

\n

已编辑

\n

如果您再滚动一点查看 @Justus Bl\xc3\xbcmer 的答案,您可以看到如何更改现有表以添加删除级联!

\n


小智 10

根据泰勒的提示,以下是如何更改现有的键约束以允许级联删除。

  1. 通过在 Supabase 的 SQL 编辑器中执行此命令来列出所有外键约束。从那里,确定您需要更改的密钥。根据删除另一个表中的父项目,插入包含您要删除的项目的表名称:
SELECT con.*
    FROM pg_catalog.pg_constraint con
        INNER JOIN pg_catalog.pg_class rel
                      ON rel.oid = con.conrelid
        INNER JOIN pg_catalog.pg_namespace nsp
                      ON nsp.oid = connamespace
    WHERE 1=1
         AND rel.relname = 'YOUR_CHILD_TABLE';
Run Code Online (Sandbox Code Playgroud)
  1. 更改适当的外键约束(此处:child_parent_id_fkey支持级联删除:
ALTER TABLE public.YOUR_CHILD_TABLE
DROP CONSTRAINT child_parent_id_fkey,
ADD CONSTRAINT child_parent_id_fkey
    FOREIGN KEY (parent_id)
    REFERENCES YOUR_PARENT_TABLE(id)
    ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解决方案,为此创建了一个[交互式代码生成器](https://index.garden/a/supabase-cascade)以便快速使用。 (5认同)