当前位置: 首页 > 知识库问答 >
问题:

MySql-触发器不工作-中止插入

丌官霖
2023-03-14

我写了这个触发器,但它不工作,我执行了这个错误:

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

但我收到同样的错误:

共有1个答案

顾学真
2023-03-14

出现语法错误是因为您没有终止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);
 类似资料:
  • 问题内容: 我有一个包含URL和代表其参数的字符串的表。问题是我希望url和parameterstring是表的唯一约束-aka没有条目可以具有相同的url AND parameter string。参数字符串可以是任意长度(长于800bytes左右,这是MySql键的最大长度,因此我不能使用Unique(url,params),因为它会引发错误…)。 我曾考虑过使用触发器来执行此操作,但是如果触

  • 我正在将一个INSERT写入一个DB2表,该表使用我插入的记录作为触发器,并被指控是锁定文件和阻止触发器工作的罪魁祸首。 目前,我可以编写记录,但它会挂起我的应用程序,并且我没有从DB2数据库得到任何响应。(尽管它确实写了!)。 我被告知我可能正在使用“更新模式”写作,但除了没有实际设置任何模式之外,我没有做任何具体的事情: 我只能猜测我的应用程序挂起的原因,其中一个猜测是没有在INSERT语句上

  • 问题内容: 使用sql Server2005。我声明了一个触发条件,该触发条件被触发为“ AFTER INSERT,UPDATE”,在此触发条件下,我使用WHILE和CURSOR在INSERTED表的行上循环。当我找到不满足特定条件的行时: 我希望触发器引发错误,并且不要插入任何触发触发器的行(甚至不包括那些已经满足我条件的行)。<-–我不知道该怎么做! 您能告诉我如何增加错误并防止插入吗? 问题

  • 我正在配置Jira触发器插件(https://github.com/jenkinsci/jira-trigger-plugin)在詹金斯: JIRA触发器配置 我们使用Jira DC版本,并且已经按照@ceilfors共享的文档中所述设置了webhook。詹金斯的工作非常简单: Jenkins构建触发器配置 还配置了一个记录器来分类任何问题: 配置日志记录器 因此,当我在项目SNDBX下添加对任务

  • 我已经为资产确认创建了一个触发器。每当在该表中插入一条新记录时,由于该触发器,同一条记录就会被插入到asset_verification_history表中。 触发器如下 当我使用使用OPEN XML的过程将数据插入asset_verification表时,这个触发器只对第一条记录有效。对于其余的记录,触发器不起作用 程序如下 问题:-如何使这个触发器适用于通过Open XML插入的每个记录?

  • 我通过jira触发器插件将jenkins作业设置为触发器<但是jenkins作业没有被触发,尽管它从JIRA那里获得了webhook事件。 我检查了如下内容。 Jenkins得到了网络钩子事件。我在詹金斯日志上检查了这个。 我试着为詹金斯设置各种方式,但都失败了。我想知道如何设置jira触发器 > 测试环境 吉拉:6.4.11 我的测试用例是。。。 Jenkins工作设置 选中:向JIRA添加注释