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 $$'附近使用正确的语法
我该如何解决?
当您通过API执行语句时,绝对不要尝试更改分隔符.DELIMITER
是一个mysql客户端内置命令,它不被MySQL服务器端解析器识别.
你无论如何都不需要它.目的DELIMITER
是消除可能出现在触发器或存储例程体内的分号的模糊性.由于API用于一次执行一个语句,因此没有歧义.SQL解析器只是将整个字符串视为一个语句.
同样,不要结束create trigger语句$$
.您不需要任何语句终止符,但SQL解析器接受;
作为可选语句终止符,因为很多人将它放在那里,即使他们没有.
下一个问题是,当你在触发器中使用列名时,你必须在它们前面添加NEW.
或者OLD.
- 在插入触发器中,你只能使用NEW.
如果你没有为列添加前缀,MySQL假设你打算设置一个系统变量喜欢tmpdir
或slow_query_log
.
如果您仍然收到1193错误,我建议您不要将对列的引用都更改name
为NEW.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保留字.记录保留字的集合.
归档时间: |
|
查看次数: |
1492 次 |
最近记录: |