如何在触发器中声明变量并将其与mysql一起使用?

时间:2010-07-05 01:06:34

标签: mysql

错误是什么?

DELIMITER $$

CREATE TRIGGER `Task_insert_trig` AFTER INSERT ON `task` 
FOR EACH ROW 
begin
declare userID int;

Set userID =(select  userID from assigned_task where Atk_Task_Id = new.Tsk_Id and Atk_Project_Id = new.Tsk_Project_Id);
insert into dashboard_event set 
Dsh_Project_Id = new.Tsk_Project_Id,
Dsh_Actor = userID,
Dsh_Action = 'Assign',
Dsh_Type = 'Task',
Dsh_Target = new.Tsk_Id,
Dsh_Date = now();
$$
end
DELIMITER ;
  

错误代码:1064   您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第12行的''附近使用正确的语法

     

错误代码:1064   您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'end附近使用正确的语法   第1行的DELIMITER

3 个答案:

答案 0 :(得分:2)

我认为错误与$$分隔符有关,$$ end delimiter;不正确。另外,我不会使用可能与表列混淆的变量名(例如assigned_task表中的userID)。 插入语法也被破坏了。 ( UPDATE :实际上插件很好,我不知道你可以这样做。)

尝试

DELIMITER $$
CREATE TRIGGER Task_insert_trig AFTER INSERT ON task FOR EACH ROW 
begin 

Set @userID =(select userID from assigned_task where Atk_Task_Id = new.Tsk_Id and Atk_Project_Id = new.Tsk_Project_Id limit 1); 
insert into dashboard_event 
(Dsh_Project_Id , Dsh_Actor , Dsh_Action ,  Dsh_Type , Dsh_Target , Dsh_Date )
values 
(new.Tsk_Project_Id, @userID,  'Assign',  'Task', new.Tsk_Id,  now());

end $$ 
DELIMITER ;

答案 1 :(得分:2)

END需要在$$之前。

通过将分隔符设置为|,可以在此fiddle的MySql 5.5.28中使用。

作为一个侧面点,我真的建议为了可读性目的整理你的代码 - 这不是一个主要的问题,但你有一些关键字在帽子里,有些没有,有些东西包裹在``,有些没有,没有缩进。

我个人也更喜欢全名 - 任务而不是 Tsk 等。当你看到完整的单词更加清晰时,当你看到各地的首字母缩略词时,真的很糟糕。咆哮。

CREATE TABLE assigned_task (
  Atk_Task_Id INT NOT NULL,
  Tsk_Project_Id INT NOT NULL);

CREATE TABLE dashboard_event (
  Dsh_Project_Id INT NOT NULL,
  Dsh_Actor INT NOT NULL,
  Dsh_Action CHAR(100) NOT NULL,
  Dsh_Type CHAR(100) NOT NULL,
  Dsh_Target INT NOT NULL,
  Dsh_Date DATETIME);

CREATE TABLE Task (
  Tsk_Id INT NOT NULL,
  Tsk_Project_Id INT NOT NULL);

CREATE TRIGGER Task_insert_trig AFTER INSERT ON Task 
  FOR EACH ROW BEGIN 

  SET @userID = (
    SELECT userID 
    FROM assigned_task 
    WHERE Atk_Task_Id = new.Tsk_Id 
      AND Atk_Project_Id = new.Tsk_Project_Id 
    LIMIT 1);

  INSERT INTO dashboard_event (
    Dsh_Project_Id, 
    Dsh_Actor, 
    Dsh_Action, 
    Dsh_Type, 
    Dsh_Target, 
    Dsh_Date)
  VALUES (
    new.Tsk_Project_Id, 
    @userID, 
    'Assign', 
    'Task', 
    new.Tsk_Id, 
    NOW());
END

答案 2 :(得分:1)

以下是我对该主题的所有发现:

这是手册中的引用:

“当程序中有多个语句时,您需要一个BEGIN / END块。您可以使用该块来包含多个语句。

但这不是全部。 BEGIN / END块也称为复合语句,是您可以定义变量和控制流的地方。“

换句话说:

(这些规则似乎以相同的方式应用于触发器和存储过程,因为它们似乎使用了相同的语法。)

首先,请注意,关于诸如IF ... END IF或WHILE ... END WHILE之类的关键字的流控制组被视为单个语句,只要它以分号终止,即它是在它结束时由一个分号整体终止:IF ... END IF; WHILE ...结束时;。

然后,如果触发器或存储过程的主体只包含一个stament,并且该语句不是变量声明,也不是上述关键字的流控制组,则该语句可能不会以分号(;)结束。没有被BEGIN ... END块包围。

相反,如果触发器或存储过程的主体包含多个stament,特别是如果它包含变量声明和/或关键字的流控制组,那么它必须包含在BEGIN ... END中块。

最后,BEGIN ... END块本身不能以分号结束。

希望这有帮助