目前,我正在使用数据库,并且遇到了一个奇怪的错误检测过程。我创建了一个,它获取三个类型为VARCHAR的参数:title, interpret, album
。这是代码:
BEGIN
INSERT IGNORE INTO Interpret (Name) VALUES (interpret);
SET @idInterpret := (SELECT id FROM Interpret WHERE Name = interpret);
INSERT IGNORE INTO Album (Name, Interpret) VALUES (album, @idInterpret);
SET @idAlbum := (SELECT id FROM Album WHERE Name = album AND Interpret = @idInterpret);
INSERT INTO Lied (Name, Album, Interpret) VALUES (title, @idAlbum, @idInterpret);
END
如果我开始此过程,则会收到一条错误消息,提示专辑字段不能为null(正确),但不应为null,因为我从上表中读取了该值。如果我用真实数据调用完全相同的SQL行(而不是使用可变变量的过程),那么一切都很好。您有任何想法为什么会这样吗?
最佳答案
避免将变量和参数命名为表的列。
在您的查询中:
SET @`idAlbum` := (SELECT `id`
FROM `Album`
WHERE `Name` = `album` AND `Interpret` = @`idInterpret`);
Interpret
,您是指表的参数还是列?我们知道那是列,MySQL解释是参数。SQL Fiddle demo
看到:
13.6.4.2 Local Variable Scope and Resolution
D.1 Restrictions on Stored Programs中存储的例程中的名称冲突
在这种情况下,请使用本地变量来关注@ Bernd-Buffen。