0

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

11:24:11 CREATE TRIGGER check_venduti AFTER INSERT ON venduti FOR EACH BEGIN SELECT count(*) AS num_rows FROM prodotto WHERE cod_prodotto=NEW.cod_prodotto if numrows < 0 then SIGNAL "error" end Error Code: 1064. You have an error在您的 SQL 语法中;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行 0.000 秒的 'if numrows < 0 then SIGNAL "error" end' 附近使用正确的语法

这些是我的表:

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)

参考 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;
|

但我收到同样的错误:

4

1 回答 1

1

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

即使您确实终止了该语句,也不会在该语句中定义SELECT任何变量。num_rowsIF

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

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

但是,您似乎真正想做的是对以下内容强制执行外键约束venduti.cod_prodotto

ALTER TABLE venduti
  ADD FOREIGN KEY (cod_prodotto) REFERENCES prodotto (cod_prodotto);
于 2013-05-25T10:41:59.687 回答