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

如何在触发器中声明变量并与mysql一起使用?,mysql,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

错误是什么

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,$$end delimiter有关;这是不对的。此外,我不会使用可能会与表列混淆的变量名,如分配的任务表中的userID。 插入语法也被破坏了。更新:事实上,插入是刚刚好,我不知道你可以这样做

试一试


我相信这个错误与$$delimiter,$$end delimiter有关;这是不对的。此外,我不会使用可能会与表列混淆的变量名,如分配的任务表中的userID。 插入语法也被破坏了。更新:事实上,插入是刚刚好,我不知道你可以这样做

试一试


以下是我在这个问题上的所有发现:

这是一份手册中的引用:

当过程中有多条语句时,需要一个开始/结束块。您可以使用块将多个语句括起来

但这还不是全部。开始/结束块,也称为复合语句,是可以定义变量和控制流的地方

换言之:

这些规则似乎以相同的方式应用于触发器和存储过程,因为这两种方法似乎使用相同的语法

首先,请注意一组关键字流控制,例如IF。。。如果或当。。。END WHILE被视为一条以分号结尾的语句,也就是说,它作为一个整体在结尾处以一个分号结尾:如果。。。如果结束;虽然结束时

然后,如果触发器或存储过程的主体仅包含一个stament,并且该语句既不是变量声明,也不是如上所述的关键字流控制组,则该语句不能以分号终止;而不是被一个开始所包围。。。端块

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

最后,开始。。。结束块本身不能以分号结尾


希望这有帮助

以下是我在这方面的所有发现:

这是一份手册中的引用:

当过程中有多条语句时,需要一个开始/结束块。您可以使用块将多个语句括起来

但这还不是全部。开始/结束块,也称为复合语句,是可以定义变量和控制流的地方

换言之:

这些规则似乎以相同的方式应用于触发器和存储过程,因为这两种方法似乎使用相同的语法

首先,请注意一组关键字流控制,例如IF。。。如果或当。。。END WHILE被视为一条以分号结尾的语句,也就是说,它作为一个整体在结尾处以一个分号结尾:如果。。。如果结束;虽然结束时

然后,如果触发器或存储过程的主体仅包含一个stament,并且该语句既不是变量声明,也不是如上所述的关键字流控制组,则该语句不能以分号终止;而不是被一个开始所包围。。。端块

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

最后,开始。。。结束块本身不能以分号结尾

希望这有助于

结束需要在$$之前

这在MySql 5.5.28中通过将分隔符设置为|来实现

作为一个补充,我真的建议你为了可读性的目的整理你的代码——这不是一个大问题,但是你有一些大写的关键字,一些不是,一些用“``包装,一些不是,并且没有缩进

我个人也更喜欢事物的全名——Task而不是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
结尾必须在$$之前

这在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