如何在触发器中声明变量并与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