You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:19:11