【问题标题】:Create mysql trigger via PHP?通过 PHP 创建 mysql 触发器?
【发布时间】:2010-09-21 17:34:08
【问题描述】:

我在 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 .

【问题讨论】:

  • 解决方案是简单地删除“DELIMITER”语句和尾随“|”。我猜 MySQL 和/或 mysqli 可以在没有它们的情况下正确解析触发块。
  • 感谢您的回答,Brian :-) 工作就像一个魅力!

标签: php mysql triggers mysqli


【解决方案1】:

虽然mysqlimulti-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)

【讨论】:

  • 我在最新版本的 MariaDB 中遇到了使用 BEGINEND 关键字:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2012-07-14
相关资源
最近更新 更多