Mysql触发器出现错误

Mysql触发器出现错误,mysql,triggers,Mysql,Triggers,我有一个触发器,它应该执行以下操作: 在条目日志表中创建新条目之前,它将从该表中获取驱动程序_id,将其放入if语句中,然后根据结果将新条目中的允许字段设置为Y或No create trigger xxx before insert on entrylog for each row if exists (select * from driver join card_driver on driver.

我有一个触发器,它应该执行以下操作:

在条目日志表中创建新条目之前,它将从该表中获取驱动程序_id,将其放入if语句中,然后根据结果将新条目中的允许字段设置为Y或No

    create trigger xxx before insert on entrylog for each row
if  exists (select *
              from driver
              join card_driver
                on driver.id = card_driver.driver_id
              join card
                on card_driver.card_id = card.id
             where driver.id = new.driver_id) then
    set new.allowed = 'Y';
end if
唯一的问题是它不起作用。如果我尝试将其放入phpmyadmin,则会不断出现此错误:

    Error

SQL query: Documentation

CREATE trigger allowedupdate before INSERT ON entrylog
FOR each
ROW
IF EXISTS (

SELECT *
FROM driver
JOIN card_driver ON driver.id = card_driver.driver_id
JOIN card ON card_driver.card_id = card.id
WHERE driver.id = new.driver_id
)
THEN
SET new.allowed = 'Y';

MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 9 
if语句取自此语句,应该产生相同的结果,只是不响应消息

$sql ="SELECT *
  FROM driver AS d 
INNER
  JOIN card_driver AS cd
    ON cd.driver_id = d.id
INNER
  JOIN card AS c
    ON c.id = cd.card_id     
 WHERE d.ID = $id";
mysql_select_db('damp');
$result = mysql_query( $sql, $conn );
$row = mysql_fetch_assoc($result);
switch($row['state_id'])
{
case "1":
   echo "<strong><font color=\"green\">Authorisation Granted!</font></strong>";
   break; // This should be a Y , the rest are N
case "2":
   echo "<strong><font color=\"red\">Your card has expired and authorisation is denied</font></strong>";
   break;
case "3":
   echo "<strong><font color=\"red\">Your card has been cancelled and authorisation is denied</font></strong>";
   break;
default:
   echo "<strong><font color=\"red\">The Card ID does not exist</font></strong>";
}

这是一个非常微妙的问题,但如果你不这样做,你就错过了最后的结局。它在那里,但分号结束了触发器定义。这就是MySQL具有分隔符关键字的原因

触发器定义应该如下所示:

delimiter $$
create trigger xxx before insert on entrylog for each row
begin
    if  exists (select *
                  from driver
                  join card_driver
                    on driver.id = card_driver.driver_id
                  join card
                    on card_driver.card_id = card.id
                 where driver.id = new.driver_id) then
        set new.allowed = 'Y';
    end if;
end;$$
delimiter ;

我还添加了开始/结束。虽然不是严格必要的,但我总是使用它们。而且,如果原始语句中有begin-end块,则可能会出现编译时错误。

据我所知,只有当分隔语句的数量超过1个时,才需要begin-end块。在查询过帐集中。。是stmt 1,如果是2则结束。所以我们需要第二个分号,因此需要一个开始-结束块。@Ravinder。原始触发器由一条语句组成,这是一条if语句。触发器的定义以set语句的分号结尾。不需要开始/结束块,但我会始终包含它。这样的块可以包含一条语句,这是真的。包含begin end块总是好的,即使对于单个可执行语句也是如此。但是设置新的。允许=如果!存在…,“Y”,新。允许;这是一个简单的解决方案,除非OP将向正文中添加更多语句。因此,现在iv出现了以下错误:1235-此版本的MySQL尚不支持“一个表具有相同操作时间和事件的多个触发器”@Lazis002。放下触发器并重新创建它。