使用 Laravel DB 播种错误禁用 TRIGGER ALL

Posted

技术标签:

【中文标题】使用 Laravel DB 播种错误禁用 TRIGGER ALL【英文标题】:DISABLE TRIGGER ALL with Laravel DB Seeding Error 【发布时间】:2016-04-16 05:22:09 【问题描述】:

我继承了一个项目。他们使用了数据库播种器。他们有这个方法;

private function cleanDatabase()
    
        foreach ($this->tables as $tableName) 
            DB::statement("ALTER TABLE $tableName DISABLE TRIGGER ALL");
            DB::statement("TRUNCATE TABLE $tableName CASCADE");
            DB::statement("ALTER TABLE $tableName ENABLE TRIGGER ALL");
        
    

当我运行 php artisan db:seed 时出现错误;

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'TRIGGER ALL' at line 1

这是唯一包含它的脚本,所以这里一定有问题。我一生中从未使用过 DISABLE TRIGGER ALL,所以甚至不确定它的作用。

【问题讨论】:

【参考方案1】:

这似乎是 MS SQL 语法。您可能应该查看 MySQL disable all triggers 并使用 MySQL 语法来实现。

【讨论】:

【参考方案2】:

我不得不走很长的路,因为似乎没有其他方法:

删除触发器,运行迁移,重新创建触发器。

DB::statement('DROP TRIGGER IF EXISTS `contract_quantities_after_update`');
DB::statement('UPDATE contract_quantities SET unit_price=(SELECT unit_price FROM contracts WHERE id=contract_quantities.contract_id)');
DB::statement('CREATE TRIGGER `contract_quantities_after_update` AFTER UPDATE ON `contract_quantities` FOR EACH ROW UPDATE contracts SET quantity=(SELECT IFNULL(SUM(quantity),0) FROM contract_quantities WHERE contract_id=NEW.contract_id) WHERE id=NEW.contract_id');

【讨论】:

以上是关于使用 Laravel DB 播种错误禁用 TRIGGER ALL的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的播种表错误?

Laravel 4 db 种子特定播种器文件

Model Factory 和 Laravel 中的 DB 播种机有啥区别?

Laravel DB Seeder 不会在控制台中播种

Laravel 5 播种

使用 Laravel 播种 MongoDB 时的 authenticationDatabase 错误