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的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 在 Doctrine Fixtures Load 中执行 SQL 文件