I’m creating a forum-type web app where users can leave comments based on a specific topic. There are registration and login steps. Right now, when a user account is deleted, everything tied to the user is also deleted, such as the comments.
Is there a way to keep the user-generated comments, but delete the user account? And replace the username with “deleted”? Do I simply remove ON DELETE CASCADE
from the migration step when creating the comments
table?
CREATE TABLE users ( id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, username TEXT NOT NULL UNIQUE, nickname TEXT NOT NULL UNIQUE, password TEXT NOT NULL, date_created TIMESTAMPTZ DEFAULT now() NOT NULL );
CREATE TABLE comments ( id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, comment TEXT NOT NULL, date_created TIMESTAMPTZ DEFAULT now() NOT NULL, date_modified TIMESTAMPTZ DEFAULT now() NOT NULL, vinmake_id INTEGER REFERENCES vinmake(id) ON DELETE CASCADE, dtc_id INTEGER REFERENCES dtc(id) ON DELETE CASCADE NOT NULL, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE NOT NULL )
Thank you.
Advertisement
Answer
One option would be to change the foreign key definition to on delete set null
instead of on delete cascade
– this also requires making the column null
able (which it currently isn’t):
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL
As explained in the documentation, this option causes the referencing column(s) in the referencing row(s) to be set to nulls […], when the referenced row is deleted.
Side note: in general, I would not actually recommend deleting users from your referential table. Instead, you could have another column in table users
that indicate that the user was deleted (say, a boolean column called active
), and that you could use as a filter in your queries. This is safer in some ways, and avoids the need to play around with the foreign key later on.