2010-09-21 127 views
6

我在执行PHP5.3如下:通过PHP创建mysql触发器?

$sql = " 
CREATE TRIGGER `_photo_fulltext_insert` AFTER INSERT ON `photo` FOR EACH ROW INSERT INTO `_photo_fulltext` SELECT * FROM `photo` WHERE `id`=NEW.`id`; 
CREATE TRIGGER `_photo_fulltext_delete` AFTER DELETE ON `photo` FOR EACH ROW DELETE FROM `_photo_fulltext` WHERE `id`=OLD.`id`; 

DELIMITER | 
CREATE TRIGGER `_photo_fulltext_update` AFTER UPDATE ON `photo` 
    FOR EACH ROW BEGIN 
    DELETE FROM `_photo_fulltext` WHERE `id`=NEW.`id`; 
    INSERT INTO `_photo_fulltext` SELECT * FROM `photo` WHERE `id`=NEW.`id`; 
    END; 
| 
DELIMITER ; 
"; 

$mysqli->multi_query($sql); 

不获取创建 “photo_fulltext_update” 触发。该语句在phpMyAdmin中运行(并创建所有触发器)。我在网上读过一些地方,MySQL服务器根本不支持DELIMITER语句,所以我正在寻找一种方法来重新编写这个多步骤的CREATE TRIGGER语句,以便mysqli :: multi_query可以将它发送给MySQL 。

谢谢!

+1

解决方案是简单地删除“DELIMITER”语句和尾部“|”。我想MySQL和/或mysqli没有它们正确解析触发器块。 – brianjcohen 2010-09-21 18:44:16

+0

感谢您的回答,布赖恩:-)工作就像一个魅力! – 2013-10-31 13:24:43

回答

11

虽然mysqli不与DELIMITERmulti-query声明任何东西,它实际上没有任何分隔符在正常的查询,做任何事情,所以才一个推一个触发条件:

$ cat i.php 
<?php 
$mysqli = new mysqli('localhost', 'test', '', 'test'); 
$sql = " 
CREATE TRIGGER `_foo_fulltext_update` AFTER UPDATE ON `foo` 
    FOR EACH ROW BEGIN 
    DELETE FROM `bar` WHERE `bar`=NEW.`bar`; 
    INSERT INTO `bar` (bar) SELECT bar FROM `foo` WHERE `bar`=NEW.`bar`; 
    END; 
"; 
$mysqli->query($sql); 
var_dump($mysqli->error); 
$ php i.php 
string(0) "" 
$ mysql 
mysql> use test; 

Database changed 
mysql> show triggers\G 
*************************** 1. row *************************** 
      Trigger: _foo_fulltext_update 
       Event: UPDATE 
       Table: foo 
      Statement: BEGIN 
    DELETE FROM `bar` WHERE `bar`=NEW.`bar`; 
    INSERT INTO `bar` (bar) SELECT bar FROM `foo` WHERE `bar`=NEW.`bar`; 
    END 
       Timing: AFTER 
      Created: NULL 
      sql_mode: 
      Definer: [email protected] 
character_set_client: latin1 
collation_connection: latin1_swedish_ci 
    Database Collation: utf8_general_ci 
1 row in set (0.00 sec) 
+0

我在MariaDB的最新版本中使用'BEGIN'和'END'关键字: – PCoder 2015-11-09 11:18:49

0

这可能会有所帮助: 下面创建上selectes表的触发器。改变代码,它可能会做你想做的。 https://github.com/junicom/mysqltriggerscript

+0

请尝试阅读http://stackoverflow.com/help/deleted-answers,以获得更多理解如何**不**答案:即:“不能从根本上回答问题的答案”:**仅仅是指向外部网站的链接** – 2013-08-15 13:54:09