【问题标题】:mysql syntax ERROR 1064 while creating a trigger创建触发器时mysql语法错误1064
【发布时间】:2020-06-01 06:59:09
【问题描述】:

我正在为我的表创建一个触发器:- 银行 银行(pin、存款、取款、余额、accno*、sno) 和 平衡 余额(accno*,balance)

我想在插入银行表后更新余额表中的余额值。 我正在使用 MySQL 服务器 (wamp64 mysql8.0.18)

mysql> create trigger update_account
    -> after insert on bank
    -> begin
    -> update balance as a
    -> set a.balance=(case
    -> when new.withdraw=1 then a.balance-new.withdraw
    -> else a.balance+new.withdraw
    -> end)
    -> where a.accno = new.accno;

但上面的代码给了我以下错误:- ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'update balance a 附近使用的正确语法 设置 a.balance = (case 当 new.withdraw=1 然后 a.balance - new.'在第 3 行

【问题讨论】:

  • 您是否重新分配了DELIMITER?并且 FOR EACH ROW 丢失了......
  • bank.withdraw 是否是伪布尔值(仅限 0 或 1 个值)?
  • @Akina 不,我没有重新分配分隔符。请帮我解决这个问题。
  • @Akina bank.withdraw 包含取款金额。
  • withdraw 包含取款金额 如果是amount,那你为什么要和1比较呢?

标签: mysql triggers sql-update create-table


【解决方案1】:

您应该创建与我的代码相同的触发器查询:

create trigger update_account
    after insert
    on bank
    for each row
begin
    update balance as a
    set a.balance=(IF(new.withdraw = 1, a.balance - new.withdraw, a.balance + new.withdraw))
    where a.accno = new.accno;
END;

如果你只有两种情况,你应该IF,不需要Case when

【讨论】:

  • 在单语句触发器 BEGIN-END 块是多余的。
  • 我仍然收到错误消息。 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 4 行的 'begin update balance as a set a.balance=(if(new.withdraw=1, a.balance-a.withdraw' 附近使用跨度>
【解决方案2】:
DELIMITER $$
DROP PROCEDURE my_procedure$$
create trigger update_account
after insert
on bank
for each row
begin
update balance as a
set a.balance= a.balance + new.withdraw + new.deposit
where a.accno=new.accno;
END$$
DELIMITER ;

我的代码现在可以工作了 谢谢大家

【讨论】:

    【解决方案3】:

    您的触发器包含 ONE 语句。所以它不需要在 BEGIN-END 块和 DELIMITER 重新分配:

    CREATE TRIGGER update_account
    AFTER INSERT
    ON bank
    FOR EACH ROW
    UPDATE balance
    SET balance = balance + new.withdraw + new.deposit
    where accno=new.accno;
    
    

    【讨论】:

    • 如果 balance + new.withdraw + new.deposit 中的任何一列为 null,则结果将为 null - null 测试可能有用。
    • @P.Salmon 当然可以。但是如果是这样我认为OP会问另一个问题或自己解决这个问题。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多