On Wed, Jan 22, 2025 at 2:00 AM Runxi Yu <m...@runxiyu.org> wrote:

> Hi,
>
> While writing a new program, I encountered the following:
>
> I have three tables: A, B, and X. Rows in X are referenced by A and/or B
> via foreign keys, one or more times. I would like to delete all orphaned
> rows in X, i.e. a row in X is deleted if and only if it is no longer
> referenced by any row in A or B. (When inserting these rows, I would
> insert X first, then the reference in A or B, in the same transaction.)
>
> To the best of my knowledge, there is no such functionality natively
> built into PostgreSQL. Alternatives include (1) using triggers or (2)
> using application logic. Both would involve locking the row in table X,
> and since I don't see a native "reference count" feature in PostgreSQL,
> the reference count would have to be maintained as a field in X. Both of
> these alternatives could get somewhat messy. In more complex schemas
> where circular references may be involved and a mark-and-sweep garbage
> collector is preferred, this would be even more difficult to implement.
>
> I therefore propose a feature, to be able to specify in a table schema
> that a row should be deleted if orphaned.


For one thing, rows *can't* be orphaned if there's a foreign key
reference.  That's the whole point of creating a foreign key.

As to automatically deleting children, ON DELETE CASCADE has been a feature
of foreign keys for at least 20 years.

-- 
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!

Reply via email to