【问题标题】:SQLite - How to delete parent row while keeping the child/children rows?SQLite - 如何在保留子/子行的同时删除父行?
【发布时间】:2015-03-30 14:38:59
【问题描述】:

我了解PRAGMA foreign_keyON DELETE RESTRICT/NO ACTION 的概念,但我面临着另一种情况。

我需要删除父行但保持子行与其关联。例如:

CREATE TABLE A(id, name);
INSERT INTO A(id, name) VALUES (1, "Loreum");

CREATE TABLE B(id, id_A, name) FOREIGN KEY(id_A) REFERENCES A(id);
INSERT INTO B(id, id_A, name) VALUES (1, 1, "Opium");
DELETE FROM A WHERE id = 1;

我想实现这一点同时保持子行完整。这可能吗?

编辑

上面的示例将我的问题与this question 分开。示例可能会帮助某些人,他们只有在有代码时才能理解。

【问题讨论】:

  • INTACT 是什么意思? id 应该还在 tableB 中?
  • 是的,子行没有任何反应,但父行被删除。是的,数据完整性会受到侵犯,但这就是我想要的:P
  • 这不适用于no action set?
  • 是的,NO ACTION 不允许我删除父级;抛出错误
  • 我正在从this 回答中寻求帮助。这表明ON DELETE NO ACTION 不允许您删除父级。基本上,SQLite 试图保持数据完整性。

标签: sqlite foreign-keys


【解决方案1】:

您可以使用deferred foreign key constraint

PRAGMA foreign_keys = on;
CREATE TABLE A(id PRIMARY KEY, name);
INSERT INTO A(id, name) VALUES (1, "Loreum");
CREATE TABLE B(id, id_A, name, FOREIGN KEY(id_A) REFERENCES A(id) DEFERRABLE INITIALLY DEFERRED);
INSERT INTO B(id, id_A, name) VALUES (1, 1, "Opium");

BEGIN;
DELETE FROM A WHERE id = 1;
INSERT INTO A(id, name) VALUES (1, "another Loreum");
COMMIT;

【讨论】:

  • 看看那个。这是这个问题的正确答案,但遗憾的是,这对我没有帮助。无论如何,谢谢。
  • 我刚刚看到this answer。你能告诉我这是否是正确的方法吗?放弃 FK 约束?
  • 强制执行是约束的重点。具有悬空 ID 的数据模型是否是正确的方法是您必须自己决定的事情。
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2021-04-20
  • 2015-04-18
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多