Как мне сохранить данные B в дочерней таблице, которая связана с данными A в родительской таблице, при удалении данных A в родительской таблице? - PullRequest
1 голос
/ 27 мая 2020

Я создаю веб-приложение по типу форума, где пользователи могут оставлять комментарии в зависимости от c topi c. Есть шаги регистрации и входа в систему. Прямо сейчас, когда учетная запись пользователя удаляется, все, что связано с пользователем, также удаляется, например, комментарии.

Есть ли способ сохранить комментарии, созданные пользователем, но удалить учетную запись пользователя? И заменить логин на «удалено»? Могу ли я просто удалить ON DELETE CASCADE из шага миграции при создании таблицы comments?

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
)

Спасибо.

1 Ответ

1 голос
/ 27 мая 2020

Один из вариантов - изменить определение внешнего ключа на on delete set null вместо on delete cascade - для этого также необходимо сделать столбец null доступным (чего в настоящее время нет):

user_id INTEGER REFERENCES users(id) ON DELETE SET NULL

Как объяснено в документации , этот параметр заставляет ссылочный столбец (-ы) в ссылочной строке (-ах) быть установлен в NULL [...], когда указанная строка удаляется.

Примечание: в общем, я бы не рекомендовал удалять пользователей из вашей справочной таблицы. Вместо этого у вас может быть другой столбец в таблице users, который указывает, что пользователь был удален (скажем, логический столбец с именем active), и который вы можете использовать в качестве фильтра в своих запросах. Это в некотором смысле безопаснее и позволяет избежать необходимости позже экспериментировать с внешним ключом.

...