【问题标题】:Creating a trigger not allowing a value that isn't in another column创建触发器不允许不在另一列中的值
【发布时间】:2021-10-07 21:41:28
【问题描述】:

我有一个关于我想创建的触发器的问题,但我不确定如何执行此操作。

我有一个表 2017_state_data,它包含每个州的一些财务指标以及所述州名。现在重要的是状态名称始终正确(并且状态当然存在),我想创建一个触发器,如果​​“状态”的值与状态名称(来自另一个表)不一致,那么它应该给出“Unknown state in entry”的警告信息。 我不完全确定如何引用不同表中的列以在触发器中使用,我希望有人可以帮助我。

我创建的触发器如下,但这不起作用,并给我留下“输入不完整”错误。

CREATE TRIGGER sureState
    BEFORE INSERT ON 2017_state_data
FOR EACH ROW
    WHEN NEW.State != (SELECT StateName FROM States)
        BEGIN SELECT RAISE(ABORT, "Unknown state in entry")
END;

提前感谢您的所有帮助。

【问题讨论】:

  • 我不精通 SQLite,但请尝试将“!=”更改为“不在”。您正在尝试将单个值与整个表进行比较。看看这是否有效。
  • 不幸的是,我仍然遇到同样的错误。

标签: sqlite triggers foreign-keys referential-integrity


【解决方案1】:

您的需求有一个名称,它是Referential integrity

您所要做的就是定义表2017_state_data 的列State,使其引用表States 的列StateName

CREATE TABLE 2017_state_data (
  ........................
  State TEXT REFERENCES States(StateName),
  ........................
);

现在,如果您启用 Foreign Key Support(默认情况下禁用):

PRAGMA foreign_keys = ON;

您确保StateName 中不存在的值不能输入State,并且不需要触发器。

【讨论】:

  • 这非常有效。我确实想尝试扩大我对触发器的了解,这就是为什么这是我的第一个猜测,但效果更好。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2012-04-13
相关资源
最近更新 更多