使用不同的表触发检查条件,然后根据结果更改插入行的值
Posted
技术标签:
【中文标题】使用不同的表触发检查条件,然后根据结果更改插入行的值【英文标题】:Trigger check condition using different table, then change value of row being inserted depending on result 【发布时间】:2014-08-29 01:54:57 【问题描述】:您好,我目前正在制作一个 SQL 触发器,它应该说“在向 CUSTOMER_ALIAS 表中插入一行时,检查该行中的三个地址列中的任何一个是否包含一个值存在于 US_STATES 表(由一列 - 'COUNTRY_NAME')中,如果客户的地址是美国州,则设置 INDICIA_STATE 当前插入到 'true' 的那一行
CREATE TRIGGER ADDRESS_T BEFORE INSERT ON MYDB.CUSTOMER_ALIAS
REFERENCING NEW ROW AS NEW_ROW
WHEN
EXISTS(SELECT * FROM MYDB.US_STATES WHERE US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_1_COUNTRY OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_2_COUNTRY OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_3_COUNTRY)
THEN SET NEW_ROW.INDICIA_STATE= 'true'
;
我收到这个错误
Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=CREATE TRIGGER ADDRESS_T BEFORE INSERT ON D;BEGIN-OF-STATEMENT;<space>, DRIVER=4.16.53
SQLState: 42601
ErrorCode: -104
根据IBM's error code list,这似乎是一个语法错误,但我不明白它来自哪里。那个触发器应该是什么样子的?
【问题讨论】:
删除了 mysql 标签,因为问题是关于 DB2 的。 【参考方案1】:除了 Gordon 所说的你应该说明它是行触发器还是语句触发器之外,我还认为 WHEN 子句需要它自己的一组括号:
CREATE TRIGGER ADDRESS_T
BEFORE INSERT ON MYDB.CUSTOMER_ALIAS
REFERENCING NEW ROW AS NEW_ROW
FOR EACH ROW
WHEN (
EXISTS (
SELECT * FROM MYDB.US_STATES
WHERE US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_1_COUNTRY
OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_2_COUNTRY
OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_3_COUNTRY
)
)
SET NEW_ROW.INDICIA_STATE= 'true'
;
【讨论】:
【参考方案2】:我不认为then
是触发器语法的一部分。您还可以使用in
简化逻辑。所以这可能有效:
CREATE TRIGGER ADDRESS_T BEFORE INSERT ON MYDB.CUSTOMER_ALIAS
REFERENCING NEW ROW AS NEW_ROW
FOR EACH ROW
WHEN EXISTS(SELECT 1 FROM MYDB.US_STATES WHERE US_STATES.COUNTRY_NAME IN (NEW_ROW.ADDRESS_1_COUNTRY, NEW_ROW.ADDRESS_2_COUNTRY, NEW_ROW.ADDRESS_3_COUNTRY)
)
SET NEW_ROW.INDICIA_STATE = 'true';
【讨论】:
这不起作用,它给了我同样的错误 - 任何人都可以确认上述语法是否有效,也许我的问题是由其他原因引起的。 @borisdzhelali 看起来你错过了FOR EACH ROW MODE DB2SQL
或FOR EACH STATEMENT MODE DB2SQL
子句; more info以上是关于使用不同的表触发检查条件,然后根据结果更改插入行的值的主要内容,如果未能解决你的问题,请参考以下文章
存储过程 将数据插入到临时表,再根据条件判断 插入到不同的表