我在 PHP5.3 中执行以下操作:
$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 .
最佳答案
虽然 mysqli
对 multi-query
语句中的 DELIMITER
没有任何作用,但它实际上对任何分隔符都没有作用在所有正常查询中,只需将触发器一一插入即可:
$ 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: root@localhost
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
关于php - 通过 PHP 创建 mysql 触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762880/