Symfony执行数据库迁移时触发器SQL报1064语法错误求助
问题解决方法
错误根源
DELIMITER 是MySQL/MariaDB客户端专属的控制命令,作用是修改客户端识别SQL语句结束的分隔符,不属于数据库服务端支持的标准SQL语法。
Symfony迁移底层通过Doctrine DBAL直接向数据库服务端发送SQL请求,服务端无法识别DELIMITER指令,因此抛出语法错误。phpMyAdmin本身属于客户端实现,原生支持DELIMITER命令,所以直接执行无报错。
解决方案
在迁移文件中删除所有DELIMITER相关语句,直接将触发器的完整定义作为单条SQL语句传入addSql方法执行即可,示例迁移代码如下:
<?php declare(strict_types=1); namespace DoctrineMigrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ final class Version20240520123456 extends AbstractMigration { public function getDescription(): string { return 'Add trigger to sync ride status to ride_history on update'; } public function up(Schema $schema): void { $this->addSql(' CREATE TRIGGER after_updating_changes AFTER UPDATE ON ride FOR EACH ROW BEGIN IF OLD.status_id <> NEW.status_id THEN INSERT INTO ride_history(`ride_id`, `status`, `created`) VALUES(NEW.id, NEW.status_id, NOW()); END IF; END '); } public function down(Schema $schema): void { $this->addSql('DROP TRIGGER IF EXISTS after_updating_changes'); } }
验证说明
修改完成后重新执行php bin/console doctrine:migrations:migrate命令即可正常创建触发器,不会再出现语法报错。
内容的提问来源于stack exchange,提问作者Fabien Julio
相关产品推荐
相关产品推荐

