由于某些原因,我无法在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
变量,尤其是用户(会话)变量
话虽如此,你的扳机可能看起来像
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_*
),因此以下是使用mysqli_*
时php代码的样子
<?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.';
尝试下面的代码。
DELIMITER $$
DROP TRIGGER IF EXISTS testing.check_title$$
USE `testing`$$
CREATE TRIGGER `check_title` BEFORE INSERT ON `customer` FOR EACH ROW
IF NEW.title NOT IN ('Mr','Miss','Ms','Dr','Mrs') THEN
SIGNAL sqlstate '45000' SET message_text = 'Constraint check_title violated';
END IF
$$
DELIMITER ;