在mysql触发器

时间:2017-01-10 02:46:55

标签: mysql triggers

我编写了一个MySQL触发器,但它给出了语法错误:

create trigger trg_check_row_exists before insert on charges
for each row
begin
    if exists (select 1 from charges c where c.product_id = new.product_id) then
        signal sqlstate '45000' set message_text = 'Record already exists in charges table';
    end if;
end

语法错误来自WHERE子句。这有什么问题?

更新

DELIMITER $$
create trigger trg_check_row_exists before insert on charges
for each row
begin
    if exists (select 1 from charges c where c.currency_value_id = new.currency_value_id) then
        signal sqlstate '45000' set message_text = 'Record already exists in charges table';
    end if;
end$$
DELIMITER ;

必须添加DELIMITER$$。现在它正在工作。

因为有多个语句; MySQL客户端威胁它们作为单独的语句而不考虑触发器作为单个语句。

1 个答案:

答案 0 :(得分:0)

你不应该使用触发器。相反,使用唯一约束/索引:

 create unique index unq_charges_productid on charges(product_id);

这将确保一次只有一个产品可以在表中。

此外,您的逻辑似乎表明您需要exists而不是not exists