【问题标题】:Deleting a record in a table which has foreign key relational tables删除具有外键关系表的表中的记录
【发布时间】:2009-05-14 05:57:38
【问题描述】:

如何删除具有外键关系的表中的记录?

假设我有 2 个表:员工和部门,第一个有 deptID 作为引用部门 ID 的外键。

现在我想删除像delete from department where depID=10 这样的表中的特定行。把部门里的员工删掉就好了,我也想维护外键关系。这样做的查询是什么?

【问题讨论】:

  • 从 depID = 10 的员工中删除?

标签: database


【解决方案1】:

您应该指定删除级联到employee 表。取决于您的数据库如何执行此操作,但几乎每个数据库都支持级联删除。

例如在 SQL Server 中:

CREATE TABLE Employee
(
    DepId INT NOT NULL REFERENCES Department(DepId) ON DELETE CASCADE
)

【讨论】:

  • 不真实。并非每个数据库都支持级联删除。
  • 不知道。哪些没有?我所知道的所有这些:Oracle、SQL Server、MySQL、PostgreSQL、DB2。当然这些是主要的。
  • 好吧,如果你使用 InnoDB,MySQL 只支持级联删除,但这是不言而喻的,因为 MyISAM 根本不支持外键。
  • 点 :) 很久以前我使用 MySQL。
【解决方案2】:

这取决于数据库以及您如何定义关系。您可能会导致删除级联,这意味着删除父项会删除子记录,或者“删除无效”,这会导致子关系在其 FK 字段中具有 NULL,或者您有什么。这取决于您的需求。通常,我不会定义 NULLIFY 或 CASCADE 并根据需要删除每条记录,而不会自动处理。

【讨论】:

    【解决方案3】:

    在 SQL Server 中,您会将关系标记为 CASCASE DELETE

    或者,首先对Employees表执行DELETE,然后对Departments表执行第二次DELETE。

    【讨论】:

      【解决方案4】:

      当您建立外键关系时,您可以定义(无论如何在 MS SQL Server 中)更新和删除时采取的操作。例如,您可以说“当部门中的记录被删除时,将删除级联到引用它的任何子表”。您可以找到更多信息here

      【讨论】:

        【解决方案5】:

        DB2 语法(因为您没有指定使用哪个 DB):

        Create table Employee
        ...
        ... 
        FOREIGN KEY (deptID) REFERENCES department (deptID)
            ON DELETE CASCADE
        

        如果您指定 CASCADE 选项,如果部门被删除,员工将被删除。

        如果您指定 RESTRICT 而不是 CASCADE,则除非首先删除属于该部门的所有员工,否则它将不允许您删除部门。

        或者,如果您不希望每次都发生这种情况,那么最好指定 RESTRICT 并在需要时首先在 emp 上执行删除

        Delete * from Employee where deptID = 10;
        Delete * from Dept where deptID = 10;
        

        这是examples的链接

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多