删除具有外键的两个表中的记录的最佳方法?

时间:2015-06-01 04:40:28

标签: sql-server sql-server-2008 sql-delete

我创建了两个表格,例如marksusers。我维护了两个表之间的外键关系,当我删除marks表中的一行时,我需要删除基于两个表中存在的uid的用户表中的特定用户。任何人都建议我?

4 个答案:

答案 0 :(得分:3)

如果要在父表中删除相应的行时在子表中删除行,请使用ON DELETE CASCADE选项。

  

但你的情况与此相反。没有办法逆转   自动。

     

删除记录时,您需要显式使用删除触发器   来自儿童桌。

顺便说一句,反向操作是不安全的,因为单个用户可能有许多标记记录,如果删除其中任何一个,则用户将从用户表中删除。

我建议在sproc中逻辑地进行。

你可以在sproc中检查用户的所有记录都在标记表中删除,而不是从用户表中删除用户。

答案 1 :(得分:2)

对于您的情况,我建议您使用on delete cascade

更多信息:
具有级联删除的外键意味着如果删除父表中的记录,则将自动删除子表中的相应记录。这在SQL Server中称为级联删除。

使用SQL Server(Transact-SQL)中的CREATE TABLE语句通过级联删除创建外键的语法是:

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

答案 2 :(得分: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

答案 3 :(得分:0)

由于我不喜欢DELETE来自相关表格的任何行,我建议您使用此解决方案:

  • status字段的默认值1添加到您的表格中。
  • 创建VIEW,仅显示status <> 0行,并使用此VIEW显示有效数据。

      

    对于父子或相关表,只显示父{C}和子表的status <> 0行,如parent.status * child.status <> 0

  •   
  • [可选&amp;附加] * 为您的数据库或表格或仅重要的表格创建log表或journal并存储一些操作,如Create,{{1 },Edit\ModifyDelete等等。
  •   
  使用此解决方案,您可以:

  • 支持UndeleteUndo
  • 支持Redo行动!
  • 不要担心没有父母的孩子。
  • * 发现旧数据,数据更改和许多其他信息。

还有许多其他好处,您只需存储与RDBMS无关的更多数据。

我只将Undelete用于最终子点的表,其数据不是那么重要。