由于某种原因,我无法让这个触发器在 PHP 中运行,即使它在 phpMyAdmin 中工作
CREATE TRIGGER `check_title` BEFORE INSERT ON `customer`
FOR EACH ROW
BEGIN
IF NEW.title NOT IN ('Mr','Miss','Ms','Dr','Mrs')THEN
SET @msg := 'Constraint check_title violated';
SIGNAL sqlstate '45000' SET message_text = @msg;
END IF
END
我尝试过使用 DELIMTER $$ 命令,并尝试通过过程和面向对象的方法来运行它。
如有任何帮助,我们将不胜感激
最佳答案
END IF
之后没有终止;
- 您根本不需要
@msg
变量,尤其是用户( session )变量
话虽这么说,你的触发器可能看起来
CREATE TRIGGER `check_title`
BEFORE INSERT ON `customer`
FOR EACH ROW
BEGIN
IF NEW.title NOT IN('Mr','Miss','Ms','Dr','Mrs') THEN
SIGNAL sqlstate '45000' SET message_text = 'Constraint check_title violated';
END IF;
END
这里是SQLFiddle 演示
<小时/>现在,从 php 执行它,您不需要更改 DELIMITER
,因为它是 mysql 客户端命令而不是 SQL 语句。
您没有提到您实际使用的扩展(mysqli_*
、PDO
,希望没有弃用mysql_*
),所以这是您的 php 代码在 mysqli_*
<?php
$db = new mysqli('localhost', 'user', 'password', 'dbname');
if (!$db) {
die('Could not connect: ' . $db->connect_error); //TODO better error handling
}
$sql = "
CREATE TRIGGER check_title
BEFORE INSERT ON customer
FOR EACH ROW
BEGIN
IF NEW.title NOT IN('Mr','Miss','Ms','Dr','Mrs') THEN
SIGNAL sqlstate '45000' SET message_text = 'Constraint check_title violated';
END IF;
END";
if (!$db->query($sql)) {
die('Can\'t create the trigger: ' . $db->error); //TODO better error handling
}
$db->close();
echo 'Trigger successfully created.';
关于php - 我在从 php 执行 MySQL 触发器时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529287/