2015-09-04 51 views
0

我想通过PHP将触发器应用于现有的表和列。 执行PHP代码时,不会引发错误,但不会创建触发器。MySQL查询适用于Phpmyadmin,但通过PHP应用时不适用?

我的PHP代码:

//file: migrations.php 

// created_at column already defined in a previous migration 
//... 

$migrations[3]['message'] = "added created_at, updated_at columns on rate table"; 
$migrations[3]['created'] = "2015-09-05 08:28:00"; 
$migrations[3]['sql']  = " 
DELIMITER | 
CREATE TRIGGER rate_created_at BEFORE INSERT ON rate 
FOR EACH ROW 
    BEGIN 
     SET NEW.created_at = CURRENT_TIMESTAMP; 
    END | 
    DELIMITER ; 
"; 

// apply migration 
foreach ($migrations as $key => $value) { 
    // run the migration SQL for the current iteration 
    $sth = $dbh->prepare($value['sql']); 
    $sth->execute(); 
} 

继承人什么工作

  • 复制和粘贴触发创建SQL到phpMyAdmin的
  • 摆脱DELIMITERBEGINEND声明 的例如如果我减少SQL到
$migrations[3]['sql']  = " 
CREATE TRIGGER rate_created_at BEFORE INSERT ON rate 
FOR EACH ROW 
     SET NEW.created_at = CURRENT_TIMESTAMP; 
"; 

它从PHP运行,问题是我不相信我可以运行多行语句,而不DELIMITERBEGINEND
我试图

  • 逃避使用不同的分隔符

分隔符

  • 我能做些什么来让PHP运行与DELIMITERBEGINEND语句在SQL?

  • +0

    运行命令定界符作为单独的查询。例如'分隔符/创建/分隔符' –

    回答

    2

    是的,你将不得不摆脱那些DELIMITER的,只是有下面的代码

    $migrations[3]['sql'] = " 
    CREATE TRIGGER rate_created_at BEFORE INSERT ON rate 
    FOR EACH ROW 
        BEGIN 
         SET NEW.created_at = CURRENT_TIMESTAMP; 
        END;"; 
    

    看到这个另一篇文章中说同样的事情PHP: multiple SQL queries in one mysql_query statement

    +0

    谢谢拉胡尔,这工作!我不知道为什么MySQL不认为在不使用不同的分隔符时没有完成整个触发器语句? –

    +0

    'DELIMITER'不是SQL语法的一部分,它是交互式用户界面的一个功能。 – Barmar

    +0

    这就是为什么你不能在sqlfiddle中使用它,你必须使用他们的菜单来设置分隔符。 – Barmar

    相关问题