You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:36:02