SQL 在使用 symfony 迁移期间返回语法错误或访问冲突:1064

Posted

技术标签:

【中文标题】SQL 在使用 symfony 迁移期间返回语法错误或访问冲突:1064【英文标题】:SQL return a Syntax error or access violation: 1064 during migration with symfony 【发布时间】:2022-01-11 15:37:03 【问题描述】:

我想添加一个触发器,将我的骑行实体的新状态插入到ride_history 实体中:

DELIMITER //
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 //
DELIMITER ;

我已经在phpmyadmin上测试过了,执行的时候没有报错,但是当我把它放到我的迁移文件中尝试迁移数据库的时候,symfony返回这个错误:

An exception occurred while executing a query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL synt
  ax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER // CREATE TRIGGER after_
  updating_changes AFTER UPDATE ON ride FOR E...' at line 1

所以我有点迷失了这一切,请帮助我!

【问题讨论】:

【参考方案1】:

DELIMITER 是客户端命令,而不是 SQL 语句。所以使用 as SQL 语句时会报错。

将您的触发文本转换为单语句形式,从而不需要 DELIMITER 命令:

CREATE TRIGGER after_updating_changes
AFTER UPDATE ON ride 
FOR EACH ROW
    INSERT INTO ride_history(`ride_id`, `status`, `created`) 
    SELECT NEW.id, NEW.status_id, NOW()
    WHERE OLD.status_id <> NEW.status_id;

PS。考虑到如果任何 status_id 值为 NULL,则不会将任何值保存到历史记录表中。因此,如果此列可以为空,则必须相应地调整 WHERE 条件。

【讨论】:

解决了!谢谢

以上是关于SQL 在使用 symfony 迁移期间返回语法错误或访问冲突:1064的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 迁移到内存表期间出现内存配额错误

Symfony2 在 Doctrine Fixtures Load 中执行 SQL 文件

Symfony 4 / doctrine插入初始数据库数据

Symfony 3.4 安装期间的错误 php json

NodeJS sequelize 自动生成模型并运行迁移 SQL 语法错误

在 Symfony 上生成迁移时忽略实体