创建一个触发器 - 声明变量 - 无法使我的触发器工作

时间:2013-07-18 08:31:08

标签: mysql triggers

此触发器旨在更新'field_csvfilepath_value'以匹配files表中的'filepath'(下面的一些表格详细信息)。但我无法让它发挥作用,请帮助。

delimiter $$
CREATE TRIGGER csv_filpath 
AFTER INSERT ON content_type_importcsv for each row 
begin
    declare p varchar(80)
    set p := (SELECT filepath FROM content_type_importcsv join files where NEW.content_type_importcsv.field_csv1_fid = files.fid)

    set NEW.field_csvfilepath_value = p

    end$$
    delimiter ;

此触发器产生以下错误:

错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'set p:=附近使用正确的语法(在第5行选择文件路径FROM content_type_importcsv加入文件,其中NEW.conte'

我正在使用mysql workbench 5.2

delimiter $$
delimiter $$

CREATE TABLE `content_type_importcsv` (
  `vid` int(10) unsigned NOT NULL DEFAULT '0',
  `nid` int(10) unsigned NOT NULL DEFAULT '0',
  `field_csv1_fid` int(11) DEFAULT NULL,
  `field_csv1_list` tinyint(4) DEFAULT NULL,
  `field_csv1_data` text,
  `field_csvfilepath_value` longtext,
  PRIMARY KEY (`vid`),
  KEY `nid` (`nid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8$$


CREATE TABLE `files` (
  `fid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned NOT NULL DEFAULT '0',
  `filename` varchar(255) NOT NULL DEFAULT '',
  `filepath` varchar(255) NOT NULL DEFAULT '',
  `filemime` varchar(255) NOT NULL DEFAULT '',
  `filesize` int(10) unsigned NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '0',
  `timestamp` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`fid`),
  KEY `uid` (`uid`),
  KEY `status` (`status`),
  KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM AUTO_INCREMENT=55 DEFAULT CHARSET=utf8$$

2 个答案:

答案 0 :(得分:0)

有一些语法错误:

  1. 您列出的是由:中的set p :=引起的,您应将其删除
  2. beginend$$之间的每一行都应以;
  3. 结尾
  4. 您无法在后触发器中更新新行,因此它应该是触发前的

答案 1 :(得分:0)

除了代码中的多个语法错误之外,您无法更改AFTER触发器中插入的行的列值。您应该使用BEFORE事件。

据说你的触发器可以归结为一个语句,因此不需要BEGIN ... END阻止和更改分隔符。

CREATE TRIGGER csv_fillpath 
BEFORE INSERT ON content_type_importcsv 
FOR EACH ROW 
  SET NEW.field_csvfilepath_value = 
  (
    SELECT filepath 
      FROM files
     WHERE fid = NEW.field_csv1_fid
     LIMIT 1
 );

这是 SQLFiddle 演示