【问题标题】:Delete a row referenced by a table删除表引用的行
【发布时间】:2020-09-26 15:24:45
【问题描述】:

我有两张桌子,table1,table2。 Table2 使用外键连接到 table1。 我想从 table1 中删除一行,而不会丢失 table2 中的数据。 怎么解决,我尝试了一个消除主键或外键约束的触发器,但是报错说我要删除的表不存在!!

【问题讨论】:

  • 在此处查看文档:postgresql.org/docs/12/sql-createtable.html。寻找外键部分。您可能正在寻找 ON DELETE SET NULL。这将保留子行(表 2),但外键列设置为 NULL。
  • 我不想在引用的表上设置 null,我希望保留原始值,尽管我正在删除它所引用的元组
  • 那么你不能有外键。您需要自己维护这种关系。

标签: sql postgresql


【解决方案1】:

您有多种方法可以做到这一点:

1 - 移除外键约束(ALTER TABLE table2 DROP CONSTRAINT FK_Column)

2 - 对 table1 使用软删除

3 - 使 table2 外键可以为空并使用“On Delete Set Null”

【讨论】:

  • 一旦表 2 上的 Fkey 约束通过 Table1 上的触发器消除后,我是否必须再次添加约束?
  • 我在删除 Table1 之前创建了一个触发器,并插入了 Alter table table2 删除约束 fkey。它给了我一个错误,说 Table2 不存在
  • 这不会有好的结局。你不能兼职FK。您要么必须处理 FK 的规则,要么不使用。
【解决方案2】:

你不能同时拥有它。也就是说,您不能在引用值所在的位置拥有外键定义。但是当引用的值被删除时它不会抱怨。

外键约束的目的是强制数据完整性。

一种反应是您实际上并没有外键约束。所以,不要这样声明。显然,table2 中有一个列,它只是对 `table1 的兼职引用。

不过,出于您的特定目的,我建议您考虑软删除。也就是说,有一个标志是table1 代表isDeleted 或更好的是deletionDatetime。然后你可以保留table1中的行,有一个全职的外键引用,不用担心关系完整性。

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多