我有两个表来处理附件:
- "文件",其中包含
id
和其他信息 - "附件",它包含
id_file
(表files
中的id
是外键)和附件的其他信息.
两个表能够共享一个文件,而不会在服务器上复制该文件(供您参考).
当我删除附件时,我只想在没有指向其id
的附件的情况下删除该文件.
我有此请求,删除链接到特定项目的所有附件(表TABLE_NAME
的第26项:
WITH deleted_files AS (
DELETE FROM public.attachments a
WHERE a.id_in_table = 26
AND a.table_name = 'TABLE_NAME'
RETURNING id_file
)
DELETE FROM public.files f
WHERE f.id IN (SELECT id FROM deleted_files)
AND NOT EXISTS (
SELECT 1
FROM public.attachments a
WHERE a.id_file = f.id
);
问题是:
- 附件被正确删除,但文件没有被删除
- 如果我再次运行相同的请求,则不会删除任何内容(这是正常的)
- 如果我用第一个删除返回的
ids
运行第二个DELETE
,它们将被正确删除.
是否存在某种机制来保留表的浅层副本和已删除的项,从而使删除项变得不可能?