从PHP代码创建触发器时出现语法错误

xra*_*alf 1 php mysql syntax triggers syntax-error

我想从以下PHP代码创建一个触发器.

  $sql = 'delimiter $$';
  $pdo->exec($sql);
  $sql = 'create trigger avoid_empty_employee_insert before insert on `employee`
          for each row begin
            if name = "" then set name = null; end if;
          end$$';
  $pdo->exec($sql);
  $sql = 'delimiter ;';
  $pdo->exec($sql);
Run Code Online (Sandbox Code Playgroud)

当我运行代码时MySQL它工作,并创建触发器.

PHP显示以下错误.

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的'delimiter $$'附近使用正确的语法

我该如何解决?

Bil*_*win 7

当您通过API执行语句时,绝对不要尝试更改分隔符.DELIMITER是一个mysql客户端内置命令,它不被MySQL服务器端解析器识别.

你无论如何都不需要它.目的DELIMITER是消除可能出现在触发器或存储例程体内的分号的模糊性.由于API用于一次执行一个语句,因此没有歧义.SQL解析器只是将整个字符串视为一个语句.

同样,不要结束create trigger语句$$.您不需要任何语句终止符,但SQL解析器接受;作为可选语句终止符,因为很多人将它放在那里,即使他们没有.

下一个问题是,当你在触发器中使用列名时,你必须在它们前面添加NEW.或者OLD.- 在插入触发器中,你只能使用NEW.如果你没有为列添加前缀,MySQL假设你打算设置一个系统变量喜欢tmpdirslow_query_log.

如果您仍然收到1193错误,我建议您不要将对列的引用更改nameNEW.name.

我使用PHP 5.4.24和MySQL 5.6.20对以下内容进行了测试,结果如下:

$sql = "create trigger avoid_empty_employee_insert before insert on `employee`
      for each row begin
          if NEW.name = '' then set NEW.name = null; end if;
      end";
$pdo->exec($sql);
Run Code Online (Sandbox Code Playgroud)

您不需要分隔列名name,因为它不是MySQL保留字.记录保留字的集合.