PostgreSQL触发器函数报错:AND参数必须为布尔类型而非整数,如何将字段转换为布尔值?
解决PostgreSQL触发器中“argument of AND must be type boolean, not type integer”报错
我来帮你搞定这个触发器的问题!你遇到的错误核心原因很明确:在IF条件判断里,你直接将整数类型的new.stake_address_id和布尔类型的boolAddress用AND连接,PostgreSQL不允许不同数据类型直接进行逻辑运算。
按照你的需求——把new.stake_address_id转换为布尔值(有值时为true,空/null时为false),我们只需要用PostgreSQL的IS NOT NULL判断即可,它会直接返回布尔结果。
下面是修正后的触发器函数和触发器创建语句:
修正后的触发器函数
CREATE OR REPLACE FUNCTION test_stake_addresses_tx_out_trigger() RETURNS trigger AS $$ DECLARE boolAddress BOOLEAN; BEGIN -- 检查test_address中是否存在对应的address SELECT EXISTS(SELECT 1 FROM test_address WHERE address = new.address) INTO boolAddress; -- 修正条件:将stake_address_id的存在性判断转为布尔值 IF new.stake_address_id IS NOT NULL AND boolAddress THEN -- 当stake_address_id有效且address已存在时,更新金额 UPDATE test_address SET amount = amount + new.value WHERE test_address.id = NEW.stake_address_id; RETURN NEW; ELSE -- 否则插入新记录 INSERT INTO test_address(id, address, amount) VALUES(new.stake_address_id, new.address, new.value); RETURN NEW; END IF; END; $$ LANGUAGE plpgsql;
触发器创建语句(原语句无需修改)
CREATE TRIGGER test1 AFTER INSERT ON "test_tx_out" FOR EACH ROW EXECUTE PROCEDURE test_stake_addresses_tx_out_trigger();
关键修改点说明:
- 将
IF new.stake_address_id AND boolAddress THEN改为IF new.stake_address_id IS NOT NULL AND boolAddress THEN:IS NOT NULL会把new.stake_address_id的存在性直接转为布尔值,完美符合你“有值为true,空/null为false”的需求,同时解决了数据类型不匹配的问题。 - 完全保留了你原本的业务逻辑:仅当
stake_address_id有效且目标地址已存在时执行更新,否则执行插入。
内容的提问来源于stack exchange,提问作者user16771164
相关产品推荐
相关产品推荐

