MySql - 触发器不起作用 - 中止插入

Posted

技术标签:

【中文标题】MySql - 触发器不起作用 - 中止插入【英文标题】:MySql - Trigger not work - Abort insert 【发布时间】:2013-05-20 19:59:02 【问题描述】:

我写了这个触发器,但它不起作用,我收到这个错误:

11:24:11 在 venduti 上插入后创建触发器 check_venduti FOR EACH ROW BEGIN SELECT count(*) AS num_rows FROM prodotto WHERE cod_prodotto=NEW.cod_prodotto if numrows

这些是我的桌子:

CREATE TABLE clienti (cod_cliente integer(4) auto_increment,nome varchar(100),cognome varchar(100),primary key(cod_cliente))Engine=InnoDB;
CREATE TABLE prodotto(cod_prodotto integer(4) auto_increment,descrizione varchar(100),qnt integer(4),primary key(cod_prodotto))Engine=InnoDB;
CREATE TABLE venduti (cod_vendita integer(4)  auto_increment,cod_cliente integer(4) REFERENCES clienti(cod_cliente),cod_prodotto integer(4)

REFERENCES prodotto(cod_prodotto),主键(cod_vendita))Engine=InnoDB;

这是我的触发器:

delimiter |
CREATE TRIGGER check_venduti
 BEFORE INSERT ON venduti
  FOR EACH ROW
   BEGIN
    SELECT count(*) AS num_rows FROM prodotto WHERE cod_prodotto=NEW.cod_prodotto
    if num_rows == 0 then
     SIGNAL "error"
    end;
   END;
|

现在,按照您的回答,我在这种模式下编辑了我的代码:

delimiter |
CREATE TRIGGER check_venduti
 BEFORE INSERT ON venduti
  FOR EACH ROW
   BEGIN
    DECLARE num_rows INT;
    SELECT count(*) INTO num_rows FROM prodotto WHERE cod_prodotto=NEW.cod_prodotto;
     if num_rows==0 then
      SIGNAL "error"
     end;
   END;
|

但我收到同样的错误:

【问题讨论】:

1.你想要什么? 2. 怎么不行?它是否显示错误?它是否显示错误的结果? num_rows 然后是 numrows 我改正了,但还是不行。 【参考方案1】:

出现语法错误是因为您没有终止SELECT 语句。

即使您确实终止了SELECT 语句,num_rows 变量也不会在IF 语句中定义。

可以SELECT 语句的结果存储在一个变量中以供后续测试:

BEGIN
  DECLARE num_rows INT;
  SELECT COUNT(*) INTO num_rows ... ;
  IF num_rows = 0 THEN
    ...

但是,您似乎真正想要做的是在venduti.cod_prodotto 上强制执行foreign key constraint:

ALTER TABLE venduti
  ADD FOREIGN KEY (cod_prodotto) REFERENCES prodotto (cod_prodotto);

【讨论】:

我已插入“;”在 select 语句的末尾,但它仍然不起作用。我编辑了我的帖子,并按照您的建议插入了新代码。 @user2225743:您的编辑显示的代码与我的答案中显示的不同;特别是,您尝试使用== 来测试是否相等,而我只使用=。 SQL 没有== 运算符。另外,请注意SIGNAL 后面必须跟 condition_value,它必须是关键字 SQLSTATE 后面跟 @987654337 @,或者之前声明的condition_name;字符串文字 "error" 两者都不是。

以上是关于MySql - 触发器不起作用 - 中止插入的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho 中止选项不起作用

使用 PL/SQL 在触发器中中止插入/更新操作

Oracle Forms:预删除触发器中的警报不起作用

修改要插入的数据的触发器不起作用(语句包含没有 INTO 子句的 OUTPUT 子句)

基本 Oracle 触发器不起作用

触发器在 SQL Server 的 BulkCopy 中不起作用