2015-06-01 3 views
2

Я создал две таблицы, такие как marks и users. Я поддерживал отношение внешних ключей между двумя таблицами. Когда я удаляю строку в таблице marks, мне нужно удалить этого конкретного пользователя в таблице пользователя на основе uid, который существует в обеих таблицах, как правило, кто-нибудь может мне предложить?Лучший способ удалить записи в двух таблицах с внешним ключом?

+0

Я пробовал как в одной таблице пользователей с столбцами как sid, name, pwd, uid (PK), аналогично в меток таблицы name все метки объекта и uid (FK). если я попытался удалить по строке в меток на основе этого uid, я могу удалить записи в таблице users? –

+1

[Как использовать каскадное удаление с SQL Server?] (Http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server) – har07

+0

Возможный дубликат [Использование триггеры для реализации действий ссылочной целостности (SQL Server)] (http://stackoverflow.com/questions/30086504/using-triggers-to-implement-referential-integrity-actions-sql-server) –

ответ

3

Используйте опцию ON DELETE CASCADE, если вы хотите, чтобы строки были удалены в дочерней таблице, когда соответствующие столбцы удалены в родительской таблице.

Но ваш случай обратный от него. Нет возможности сделать обратный автоматически.

Нужно использовать триггер delete, когда запись удаляется из таблицы детей.

ОТМЕТЬТЕ его небезопасно, чтобы сделать обратное, поскольку может быть много записей меток для одного пользователя, и если вы удалите любой из них, тогда пользователь будет удален из таблицы пользователя.

Я предлагаю сделать это логически в sproc.

вы можете проверить в sproc, что вся запись для пользователя удалена в таблице меток, чем удаление пользователя из таблицы пользователя.

2

Ну для Вашего случая, я рекомендую использовать on delete cascade

Подробнее об этом:
Внешний ключ с каскадом удаления означает, что если запись в родительской таблице удаляется, то соответствующие записи в дочерней таблице автоматически удаляется. Это называется каскадным удалением в SQL Server.

Синтаксис для создания внешнего ключа с каскадное удаление с помощью инструкции TABLE в SQL Server (Transact-SQL) CREATE является:

CREATE TABLE child_table 
(
    column1 datatype [ NULL | NOT NULL ], 
    column2 datatype [ NULL | NOT NULL ], 
    ... 

    CONSTRAINT fk_name 
    FOREIGN KEY (child_col1, child_col2, ... child_col_n) 
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n) 
    ON DELETE CASCADE 
    [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
); 

Для далее this

+0

нет, вы не можете сделать что –

+0

, если я хочу удалить записи из asp.net, как я могу реализовать это в sql-команде? –

+0

, вы можете с уверенностью сказать, но вы должны быть осторожны, например, вы удаляете дочернюю запись с помощью uid 1, а затем удаляете из записи родительской таблицы с помощью uid 1, может быть еще больше дочерних записей с uid как 1, и в этом случае он не позволит удалить –

0

В конструкции просто использовать при удалении каскада

CREATE TABLE child_table 
(
    column1 datatype [ NULL | NOT NULL ], 
    column2 datatype [ NULL | NOT NULL ], 
    ... 

    CONSTRAINT fk_name 
    FOREIGN KEY (child_col1, child_col2, ... child_col_n) 
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n) 
    ON DELETE CASCADE 
    [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
); 

Теперь, когда вы удаляете родителя. ребенок будет автоматически удален ... вам не нужно делать ничего

проверки Ссылки на деталь On delete cascade

0

Как я не люблю DELETE любую строку из связанных таблиц, я предлагаю вам это решение:

  • Добавить status поле со значением по умолчанию 1 к вашему столу (ов).
  • Создайте VIEW, который отображает только строки с status <> 0 и используйте это VIEW, чтобы показать достоверность данных.

    Для родителей и детей или связанных таблиц просто показать строки с status <> 0 для обоих родителей и ребенка, как таблицы parent.status * child.status <> 0.

  • [Дополнительный & дополнительные] * Создать log таблицу или journal для вашей базы данных или таблиц или просто важные таблиц и хранить какое-то действие, как Create, Edit\Modify, Delete, Undelete и так далее.
С помощью этого решения вы можете:

  • Поддержка Undo и Redo.
  • Опора Undelete действие!
  • Не беспокойтесь о ребенке, у которого нет родителя.
  • * Найдено старых данных, данных и многое другое.

И многие другие преимущества, и вы просто храните больше данных, что это не касается хорошей РСУБД.

Я использую DELETE только для таблицы, которая находится на конце детской точки, и ее данные не так важны.

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