创建禁止插入不在另一表列中值的SQL触发器问题咨询
问题原因
你的代码存在两个核心问题导致报错和逻辑不生效:
- 判断逻辑错误:你用
NEW.State != (SELECT StateName FROM States)做判断,子查询会返回States表全部州名,单值比较符无法直接匹配多值结果,不符合「检查州名是否不存在」的需求。 - 语法不完整:
BEGIN和END包裹的执行语句末尾缺少分号,解析器识别为输入不完整,就会抛出incomplete input错误。
修正后代码(适配SQLite语法,和你原写法的语法环境一致)
CREATE TRIGGER sureState BEFORE INSERT ON 2017_state_data FOR EACH ROW WHEN NOT EXISTS (SELECT 1 FROM States WHERE StateName = NEW.State) BEGIN SELECT RAISE(ABORT, 'Unknown state in entry'); END;
补充说明
- 这里用
NOT EXISTS判断比NOT IN更稳妥,不会因为States表的StateName存在空值导致判断逻辑失效 - 如果你希望更新2017_state_data表的State字段时也做校验,可以把触发器触发时机改成
BEFORE INSERT OR UPDATE ON 2017_state_data
内容的提问来源于stack exchange,提问作者user12973342
相关产品推荐
相关产品推荐

