2010-09-21 181 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