【问题标题】:Cannot create trigger in mysql at phpmyadmin无法在 phpmyadmin 的 mysql 中创建触发器
【发布时间】:2015-04-03 16:08:29
【问题描述】:

我正在尝试通过在 phpmyadmin 中将一行插入数据库后组合字段来创建一个 ID。我在以下触发器语句的第 3 行收到错误:

DROP TRIGGER IF EXISTS `scanID2`;
CREATE DEFINER=`root`@`localhost` 
TRIGGER `scanID2` 
AFTER INSERT ON db_name.`scan_data` 
FOR EACH ROW 
BEGIN 
UPDATE db_name.scan_data 
SET @data1 = concat(RIGHT(scanContent,2), RIGHT(operatorID,2), RIGHT(deviceID,2), RIGHT (scanDate, '-', ''), REPLACE (scanTime, ':', ''));
INSERT INTO db_name.scan_data(scanID) VALUES (@data1);
END
//

错误是:

#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 'CREATE DEFINER=`root`@`localhost`
TRIGGER `scanID2`
AFTER INSERT ON db_name' at line 2 

好的,所以我想出了如何执行查询。触发器已创建,但我认为它没有完成它应该做的事情。记录不会更新。这是新代码:

BEGIN 
SET @data1 = concat(RIGHT(scanContent,2), RIGHT(operatorID,2), RIGHT(deviceID,2), REPLACE (scanDate, '-', ''), REPLACE (scanTime, ':', ''));
INSERT INTO vacseen1_connect.scan_data(scanID) VALUES (@data1);
END

【问题讨论】:

  • 错误信息是什么?同时提供完整的触发语句
  • 您仍然需要在触发器中终止语句,即使用分号。而且我不确定您要对更新语句做什么。是什么样的触发器?
  • 我希望“scanID”是 scanContent、operatorID、deviceID、scanDate 和 scanTime 中数字的组合。我正在从 android 设备中获取这些详细信息,并在带有这些详细信息的 scanID 列中插入一个空白“”。插入后,我希望使用新创建行的触发器更新表。
  • 请求您的输入 MySQL_Rockstar 和pale_。已经为此苦苦挣扎了两天。

标签: mysql triggers phpmyadmin


【解决方案1】:

有几件事情需要考虑:

  1. 使用BEFORE 事件作为触发器而不是AFTER。这样,您可以在插入行的同时设置 scanID 的值。
  2. 使用NEW 关键字访问正在插入的行的字段。
  3. 由于现在是一个语句触发器,因此您无需更改分隔符并使用 BEGIN ... END 块。
  4. 您很可能打算将REPLACE 用于scanDate。

试试

CREATE TRIGGER scanID2 
BEFORE INSERT ON scan_data 
FOR EACH ROW 
SET NEW.scanID = CONCAT(
    RIGHT(NEW.scanContent, 2), 
    RIGHT(NEW.operatorID, 2), 
    RIGHT(NEW.deviceID, 2), 
    REPLACE(NEW.scanDate, '-', ''), 
    REPLACE (NEW.scanTime, ':', '')
);

这是一个SQLFiddle演示

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 2017-08-27
    • 2013-07-26
    • 2013-12-12
    • 2018-03-04
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多