触发语法问题

时间:2013-06-04 20:48:02

标签: mysql sql triggers

大家好,我试图为这个表创建一个触发器:

create table Episode(
  title varchar(25) not null,
number int not null,
  length time not null,
  aired date not null,
  serie_name varchar(25),
PRIMARY KEY(title,number),
  FOREIGN KEY (serie_name)REFERENCES Serie(name)
  ) ENGINE=InnoDB;

这是一个节省一些电视连续剧的数据库表...所以触发器必须检查我是否试图插入一个在先例之前已经播出的新剧集....但我有一些问题解决方案? 我试过这个:

create trigger ControlDataEp
 before insert on Episode
 for each row
begin
if new.aired<(select aired from Episode where title=new.title and number=new.number-1)
    then raise.application_error(-21,'error');
end if;

端;

2 个答案:

答案 0 :(得分:0)

如果我是你,我就不会在没有必要时使用触发器。

您可以使用

请查看我链接的相应手册页以获取更多信息。

要解释,为什么您的解决方案不起作用:

if new.aired<(select aired 

您的子查询可能会返回多行。请改用SELECT MAX(aired) ...

... and number=new.number-1)

依靠数据库外部的代码来确保数据库中的数据是可以的,这是一个坏主意。

then raise.application_error(-21,'error');

raise.application_error()不是MySQL内置函数。您不能像这样从MySQL中的代码中调用函数。如果你真的想在MySQL中引发错误,请使用SIGNAL s

答案 1 :(得分:0)

如果您不太关心返回有意义的错误消息,可以将触发器简化为一个语句

CREATE TRIGGER ControlDataEp
BEFORE INSERT ON Episode
FOR EACH ROW
SET NEW.aired = 
(
  SELECT IF(IFNULL(MAX(aired), 0) < NEW.aired, NEW.aired, NULL)
    FROM Episode 
   WHERE title = NEW.title 
     AND number = NEW.number - 1
);

它的作用违反了NOT NULL列的aired约束。

这是 SQLFiddle 演示。 取消注释上一个插入语句

现在,如果您需要返回自定义错误消息:

  1. 您可以使用SIGNAL但仅限于MySql 5.5及更高版本
  2. 使用一种hackish方式(例如TRIGGERs that cause INSERTs to fail? Possible?Throw an error in a MySQL trigger