MYSQL:过程和触发器错误
我是MySQL的新手,我的过程中遇到了一个错误,我希望能够调用相同的东西来更新、插入和删除我的表,所以需要一个过程来调用。 我看过和其他一些,但没有任何帮助。delimiter关键字也不能产生seperate错误,但这没有帮助 错误是这样的,我无法理解它的含义: 错误 SQL查询:MYSQL:过程和触发器错误,mysql,triggers,procedure,Mysql,Triggers,Procedure,我是MySQL的新手,我的过程中遇到了一个错误,我希望能够调用相同的东西来更新、插入和删除我的表,所以需要一个过程来调用。 我看过和其他一些,但没有任何帮助。delimiter关键字也不能产生seperate错误,但这没有帮助 错误是这样的,我无法理解它的含义: 错误 SQL查询: -- trigger on work log change DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES CREATE DEFINER = root@localhost PR
-- trigger on work log change
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES CREATE DEFINER = root@localhost PROCEDURE PROC_TRACK_CHANGES BEGIN INSERT INTO CHANGES( LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone )
SELECT NOW( ) , EmployeeID, LogTimeStamp, ProposalID, WorkDone
FROM WORKLOG;
MySQL说:
1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用“创建定义器”附近的正确语法=root@localhost程序进程跟踪更改
开始
在第3行中插入'
有问题的错误红色代码如下:
CREATE TABLE WORKLOG(
EmployeeID BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY PKEY
LogTimeStamp TIMESTAMP, -- PKEY
ProposalID BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY
WorkDone VARCHAR(200),
CONSTRAINT WORKLOG_FOREIGN_KEY_EMP FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEES (EmployeeID),
CONSTRAINT WORKLOG_FOREIGN_KEY_PRO FOREIGN KEY (ProposalID) REFERENCES PROPOSALS (ProposalID),
CONSTRAINT WORKLOG_PROPOSALS_PRIMARY_KEY PRIMARY KEY (EmployeeID, LogTimeStamp)
);
CREATE TABLE CHANGES(
LoggedTimeStamp TIMESTAMP, -- PKEY
EmployeeID BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY
LogTimeStamp TIMESTAMP, -- fkey
ProposalID BIGINT UNSIGNED NOT NULL UNIQUE, -- FKEY
WorkDone VARCHAR(200),
CONSTRAINT CHANGES_FOREIGN_KEY_EMP FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEES (EmployeeID),
CONSTRAINT CHANGES_FOREIGN_KEY_PRO FOREIGN KEY (ProposalID) REFERENCES PROPOSALS (ProposalID),
CONSTRAINT CHANGES_PRIMARY_KEY PRIMARY KEY (LoggedTimeStamp)
);
-- trigger on work log change
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES
CREATE DEFINER=root@localhost PROCEDURE PROC_TRACK_CHANGES
BEGIN
INSERT INTO CHANGES (LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone)
SELECT now(), EmployeeID, LogTimeStamp, ProposalID, WorkDone FROM WORKLOG;
END;
DROP TRIGGER IF EXISTS TR_WORKLOG_UPDATE
CREATE DEFINER=root@localhost TRIGGER TR_WORKLOG_UPDATE
BEFORE UPDATE ON 'WORKLOG'
FOR EACH ROW
BEGIN
CALL PROC_TRACK_CHANGES();
END;
DROP TRIGGER IF EXISTS TR_WORKLOG_INSERT
CREATE DEFINER=root@localhost TRIGGER TR_WORKLOG_INSERT BEFORE INSERT ON WORKLOG
FOR EACH ROW
BEGIN
CALL PROC_TRACK_CHANGES();
END;
DROP TRIGGER IF EXISTS TR_WORKLOG_DELETE
CREATE DEFINER=root@localhost TRIGGER TR_WORKLOG_DELETE BEFORE DELETE ON WORKLOG
FOR EACH ROW
BEGIN
CALL PROC_TRACK_CHANGES();
END;
我可能遗漏了一些简单的东西,但MYSQL调试器让我感到困惑。
非常感谢 试试这个:
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES;
请注意末尾的分号。过程删除是一条语句,也是一个过程创建。用分隔符分隔它们
另一件事是,您需要定义另一个分隔符,而不是;。否则,DB将在第一时间终止所有语句;这使得一些触发器和过程定义不完整。所以,举个例子
delimiter |
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES
|
CREATE DEFINER=root@localhost PROCEDURE PROC_TRACK_CHANGES
BEGIN
INSERT INTO CHANGES (LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone)
SELECT now(), EmployeeID, LogTimeStamp, ProposalID, WorkDone FROM WORKLOG;
END
|
您应该指定分号以外的临时分隔符,并在DROP PROCEDURE和CREATE PROCEDURE语句的末尾使用该分隔符 此外,您还需要在CREATEPROCEDURE语句中的过程名称后添加括号,即使它不带任何参数 这应该适合您:
DELIMITER $$
DROP PROCEDURE IF EXISTS PROC_TRACK_CHANGES $$
CREATE DEFINER=root@localhost PROCEDURE PROC_TRACK_CHANGES ()
BEGIN
INSERT INTO CHANGES (LoggedTimeStamp, EmployeeID, LogTimeStamp, ProposalID, WorkDone)
SELECT now(), EmployeeID, LogTimeStamp, ProposalID, WorkDone FROM WORKLOG;
END $$
DELIMITER ;
触发器删除是一条语句,也是一个触发器创建语句。把它们分开;谢谢,我仍然对什么是单语句以及什么可以跨多行的语法感到困惑。使用分隔符的问题是我得到了错误:使用它时未知标点字符串。这很奇怪。如何执行此操作?我认为它来自于使用多个字符分隔符,如“//”或“$$”。。。现在我得到了一个“需要超级特权错误”,我认为这意味着它可以工作,只是不允许我这么做。