【发布时间】:2018-07-26 05:59:45
【问题描述】:
我有一个 id 作为自动递增主键和另一个 id 的表。
CREATE TABLE tester (
"id" integer PRIMARY KEY AUTOINCREMENT,
"refId" integer DEFAULT 0
);
refId 应该能够为 0(默认值)或引用 id 如果 refId > 0(即充当外键)。
现在我需要两个约束:
- 只有当行的 id 未被任何其他行的 refId 使用(引用?)时,该行才可删除
- 只有 refId 为 0 的行才可删除。
据我了解,我需要创建一个触发器,在 DELETE 事件发生之前检查这些约束。并根据 refId 的值中止或允许删除操作。
但是,我很难理解它的语法以及如何进行条件检查。但到目前为止我所知道的(记住!)是关于 1.):
CREATE TRIGGER no_delete_if_inuse
BEFORE DELETE ON tester
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'cannot delete because of foreign key violation')
WHERE (SELECT "refId" FROM tester WHERE "refId" = OLD."id") IS NOT NULL;
END;
关于 2.)
CREATE TRIGGER no_delete_if_ref
BEFORE DELETE ON tester
FOR EACH ROW BEGIN
IF OLD."refId" > 0 THEN RAISE(ABORT, "cannot delete tester because it refers to an existing tester");
END;
这有意义并且有效吗? 我完全不确定,对我来说确实如此,但很好,我都是菜鸟。
最后一个问题,我可以将它组合成一个触发器吗?例如,这是否是一个有效的查询:
CREATE TRIGGER no_delete_if_inuse
BEFORE DELETE ON tester
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'cannot delete because of foreign key violation')
WHERE (SELECT "refId" FROM tester WHERE ("refId" = OLD."id" OR "refId" > 0) ) IS NOT NULL;
END;
【问题讨论】:
标签: sql postgresql sqlite triggers