【问题标题】:How to delete rows within the table when there are foreign keys in other tables其他表有外键时如何删除表中的行
【发布时间】:2019-04-03 12:16:39
【问题描述】:

这是我的表:(我使用的是 Oracle SQL)

FILM (Catalog_Num, Format, Title, Year, Number_Discs, Rating, Timing, Genre)
INVENTORY (Film_ID, Rental_Price, New, Date_In, Catalog_Num@, Store_Num@) 

现在我想删除电影年份超过 2015 年的行, 所以我写了:

delete from film 
where catalog_num in(
select catalog_num
from film join inventory using (catalog_num)
where year >'2015';

但是,它显示了违反完整性约束的错误-找到了子记录

我该如何解决这个问题? 谢谢!

【问题讨论】:

  • 删除其他表中依赖于这些键的行
  • 最好的方法是使用 CASCADE DELETE 功能。 techonthenet.com/oracle/foreign_keys/foreign_delete.php
  • @AbhijithNagarajan - 仅适用于“最佳”的某些值。对于许多人来说,外键的一个主要好处是它们可以防止我们意外删除具有相关记录的行。
  • @APC,我完全同意。 CASCADE DELETE 最适合仅在没有父母的情况下孩子没有存在的父子关系中。

标签: sql oracle foreign-keys constraints


【解决方案1】:

这取决于您要如何处理 inventory 表中的记录。

例如,您可以修改约束并添加on delete cascade,因此该记录将与其他记录一起删除。

CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE CASCADE

或者你设置on delete set null所以fk将设置为null

CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE SET NULL

【讨论】:

  • 我可以使用 SQL 语句来完成查询而不是更改表约束吗?
  • 是的,您应该首先使用 fk 从表中删除记录,然后才能从父表中删除。
  • @ShinYuWu - 您要求一条 SQL 语句。在删除时更改外键以级联是在单个语句中满足您的要求的方法。另一种方法是从子表中单独进行初步删除。
【解决方案2】:

当您删除被其他记录引用的记录时,您还必须对后者执行一些操作:删除记录或引用。您可以使用另一个删除语句手动执行此操作,但最好将此任务委托给 Oracle。

如果要删除记录,请使用 ON DELETE CASCADE 选项提供约束。
如果您只想删除引用,请提供ON DELETE SET NULL 选项。

您可以在此处阅读更多信息:Data Integrity

【讨论】:

    【解决方案3】:

    如果您不想删除引用的记录:

    ALTER TABLE table_name
    DISABLE CONSTRAINT constraint_name;
    

    【讨论】:

    • 我认为这不是一个好的解决方案,因为 1) 它仍然是您不再需要的数据。 2) 缺少优化器的信息,这可能导致更糟糕的查询
    • 当然这不是一个好的解决方案.. 级联更好,您已经回答了..这是他的电话..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多