在shell命令行中创建mysql触发器

时间:2018-03-09 12:13:12

标签: mysql command-line

我需要在命令行中创建一个mysql触发器

这个sql在mysql控制台中运行良好:

$sql = "
    USE DB1;
    DROP TRIGGER IF EXISTS my_trigger;
    DELIMITER $$
    CREATE TRIGGER my_trigger AFTER UPDATE ON tbl1
     FOR EACH ROW BEGIN 
        INSERT INTO DB2.tbl2 (column1)
        VALUES (1234);
    END$$
    DELIMITER ;
";

$cmd = 'mysql -sse "'.$sql.'";';

//put all in one line to avoid shell errors
$cmd = preg_replace('/\r\n|\r|\n|\t|\s+/m', " ", $cmd);

exec("($cmd) 2>&1", $output, $result);

这引发了一个mysql错误

  

第1行的错误1064(42000):您的SQL语法出错;   检查与您的MySQL服务器版本对应的手册   正确的语法在第1行的''END \'附近使用

我也试过DELIMITER // ...同样的错误

1 个答案:

答案 0 :(得分:0)

解决方案:使用DELIMITER $$更改\d $$(花了两天时间:()

在php中必须使用\\d $$

$sql = "
    USE DB1;
    DROP TRIGGER IF EXISTS my_trigger;
    \\d $$
    CREATE TRIGGER my_trigger AFTER UPDATE ON tbl1
     FOR EACH ROW BEGIN 
        INSERT INTO DB2.tbl2 (column1)
        VALUES (1234);
    END$$
    \\d ;
";

$cmd = 'mysql -sse "'.$sql.'";';

//put all in one line to avoid shell errors
$cmd = preg_replace('/\r\n|\r|\n|\t|\s+/m', " ", $cmd);

exec("($cmd) 2>&1", $output, $result);
  

似乎当我们将所有内容放在一行时,只能使用分隔符的简写\d