1

Допустим, у меня есть две таблицы - пользователя и PostSQL Server - Циклическая Каскад Путь

Я представил настроенное Регистрация таблицу Голосуйте иметь много-ко-многим между пользователем и Сообщение.

таблицы имеет следующую структуру:

  • Пользователь (UseId, имя)
  • Сообщение (сообщения дана, UserId, содержание)
  • Голосуйте (Id, UserId, PostId, Value)

Примечания:

  • подчеркнутая столбцы каждой таблицы является PK.
  • UserId в сообщении является FK к пользователя столом.
  • В UserId и PostId столбцов в ГОЛОСУЕТ таблицы FK к соответствующим таблицам.
  • Другие столбцы, такие как Value, Content, Name и т. Д. Являются varchar.

Учитывая выше конструкцию целесообразно (если нет, предложения приветствуются :) .....

Что я хочу:

  1. Если строка в сообщение Таблица удалена, связанная строка в Голосовать также следует удалить.
  2. Если строка в Пользователь Таблица удалена, соответствующая строка в Голосовать также следует удалить.
  3. Если строка в пользователя таблицы удаляется, UserId столбец соответстующих Его в сообщении должен быть установлен в NULL.

Могу ли я достичь таких отношений, без каких-либо Cyclic-Redundancy? Если да, то как?


UPDATE:

Проверьте этот удивительный answer, если вы тоже столкнулись несколько путей каскада:

ответ

2

Вы ищете каскадные внешний ключ. Для первых двух:

alter table vote 
    add constraint fk_vote_user 
     foreign key (userid) references user(userid) on delete cascade; 

alter table vote 
    add constraint fk_vote_post 
     foreign key (postid) references post(postid) on delete cascade; 

За третий:

alter table post 
    add constraint fk_post_user 
     foreign key (userid) references user(userid) on delete set null; 

Это объясняется в documentation.

+0

Вы забыли детали «ссылок», или я что-то упустил? –

+1

@MikeNakis. , , Спасибо. –

+0

@GordonLinoff Я пробовал каскадные внешние ключи, но в итоге я получил циклические избыточности. Я попробую это по-своему и посмотрю :) –

1

Один из способов - добавить isdeleted bit, changed datetime столбцов в каждую таблицу и использовать триггеры для обновления значений столбцов при удалении. В этом случае вы будете хранить историю своих голосов, сообщений и пользователей.

Или просто удалить триггеры.

Или использовать каскадные отношения, как отправил Гордон Линофф.

Смежные вопросы