我无法从php执行MySQL触发器

时间:2013-12-11 20:29:15

标签: php mysql

出于某种原因,我不能让这个触发器在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 $$命令,并试图通过编写过程和面向对象的方法来运行它。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

尝试以下代码。

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 ;

答案 1 :(得分:0)

  1. 您在;
  2. 之后没有终止END IF
  3. 您根本不需要@msg变量,尤其是用户(会话)变量
  4. 据说你的触发器看起来像

    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代码与{ {1}}

    mysqli_*