我写了这个触发器,但它不工作,我执行了这个错误:
11:24:11创建触发器check_venduti在INSERT ON venduti之后,对每一行开始SELECT count(*)作为num_rows FROM prodotto(其中COD_PRODOTTO=New.COD_PRODOTO如果numrows<0,则发出“Error”信号,结束错误代码:1064)。您的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))工程=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;
|
但我收到同样的错误:
出现语法错误是因为您没有终止select
语句。
即使确实终止了select
语句,也不会在if
语句中定义任何num_rows
变量。
您可以将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);