【问题标题】:Best way to delete records in two tables having foreign key?删除具有外键的两个表中的记录的最佳方法?
【发布时间】:2015-06-01 04:40:27
【问题描述】:

我创建了两个表,例如 marksusers。我维护了两个表之间的外键关系,当我删除marks 表中的一行时,我需要根据两个表中普遍存在的uid 删除用户表中的特定用户。有人可以建议我吗?

【问题讨论】:

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


【解决方案1】:

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

但是你的情况是相反的。没有办法让它反转 自动。

每当记录被删除时,您都需要明确使用删除触发器 来自子表。

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

我建议在 sproc 中进行逻辑处理。

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

【讨论】:

    【解决方案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

    【讨论】:

    • 如果我想从 asp.net 中删除记录,我该如何在 sql 命令中实现呢??
    • 就删除而言,肯定可以,但是要小心,比如删除uid为1的子记录,然后从父表中删除uid为1的记录,可以有还有更多的 uid 为 1 的子记录,在这种情况下它不允许删除
    • 实际上我的主题是如果我们删除标记表中的记录,那么那个人用户 pwd 也想删除,在这种情况下,只有被删除的记录的人不能有访问权限。在这两个记录删除之后登录用户详细信息时并行表不存在 naa 吗?这就是我的情况。如果有人理解请回复,bcz 我是 db 的新手,我没有解释清楚..
    【解决方案3】:

    在设计中只用于删除级联

    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 } ] 
    );
    

    现在,当您删除 parent 时。孩子会自动删除...你不需要做任何事情

    查看链接了解详情 On delete cascade

    【讨论】:

      【解决方案4】:

      由于我不喜欢 DELETE 相关表中的任何行,我建议您使用以下解决方案:

      • 将默认值为1status 字段添加到您的表中。
      • 创建一个VIEW,它只显示带有status <> 0 的行,并使用这个VIEW 来显示您的有效数据。

        对于父子表或相关表,只需为父表和子表显示带有status <> 0 的行,例如parent.status * child.status <> 0

      • [可选和附加]* 为您的数据库或表或仅您的重要表创建log 表或journal,并存储一些操作,如CreateEdit\ModifyDeleteUndelete 等等。
      使用此解决方案,您可以:
      • 支持UndoRedo
      • 支持Undelete行动!
      • 不用担心没有父母的孩子。
      • *发现旧数据、数据变化等诸多信息。

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

      我将DELETE 仅用于位于最终子点的表,其数据并不那么重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多