Mysql执行两个if语句,尽管一个是真的,另一个是假的

时间:2014-03-22 11:47:56

标签: mysql

我有这个存储过程

delimiter $$
CREATE TRIGGER le_trigger
AFTER INSERT ON inbox
FOR EACH ROW
BEGIN
declare last_inserted_number VARCHAR(100) DEFAULT '0800100200';
declare last_inserted_message VARCHAR(100) DEFAULT 'Lorem Ipsum';

set last_inserted_number = NEW.in_number;
set last_inserted_message = NEW.in_message;

if(select exists(select id from transactions where tel =last_inserted_number) = 0) then

insert into transactions (message,tel)values(last_inserted_message,last_inserted_number);

if(select exists(select id from transactions where tel =last_inserted_number) > 0) then

insert into outbox (out_message,out_number) values("there was an error",last_inserted_number);

end if;end if;
END$$
delimiter ;

这就是它应该如何工作。如果我在收件箱表中插入一些东西,触发器会选择消息和电话号码并将其插入到事务表中,如果该号码不在事务中。如果触发器发现该数字存在于交易中,它会在发件箱中插入错误。

在我的代码中,每次插入收件箱时,存储过程都会插入到错误表中。我的程序出了什么问题?。

1 个答案:

答案 0 :(得分:0)

你有一个合乎逻辑的谬误。执行insert后,表中存在该值。这导致第二个条件找到行。我想你想要一个else声明:

if (not exists(select id from transactions where tel = last_inserted_number)) then
    insert into transactions(message, tel)
        values(last_inserted_message, last_inserted_number);
else
    insert into outbox(out_message, out_number)
        values("there was an error", last_inserted_number);
end if;

请注意,我删除= 0并使用not exists更改了逻辑。此外,最好在所有变量前加上v_之类的内容,这样它们就不会与表中的列混淆。