目前我正在与数据库合作,我得到了一个奇怪的错误wirth程序。我创建了一个获取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
如果我开始这个程序,我得到一个错误,说明专辑字段不能为空(这是正确的)但它不应该为空,因为我从上表中读取了值。如果我用真实数据(而不是变量程序)调用完全相同的SQL行,那么一切都很好。你知道为什么会这样吗?
答案 0 :(得分:2)
避免将变量和参数命名为表的列。
在您的查询中:
SET @`idAlbum` := (SELECT `id`
FROM `Album`
WHERE `Name` = `album` AND `Interpret` = @`idInterpret`);
Interpret
,您指的是表格的参数或列吗?我们知道这是列,MySQL解释是参数。
请参阅:
在这种情况下,使用本地varibales跟随评论@ Bernd-Buffen。
答案 1 :(得分:0)
要在存储过程中使用变量,您必须 DECLARE 然后再使用它 可以使用它们没有引号。我已更改您的查询,但未进行测试。
BEGIN
DECLARE idInterpret DEFAULT ='';
DECLARE idAlbum DEFAULT ='';
INSERT IGNORE INTO Interpret (Name) VALUES (interpret);
SELECT id IN TO idInterpret FROM Interpret WHERE Name = interpret;
INSERT IGNORE INTO Album (Name, Interpret) VALUES (album, idInterpret);
SELECT id INTO idAlbum FROM Album WHERE Name = album AND Interpret = idInterpret;
INSERT INTO Lied (Name, Album, Interpret) VALUES (title, idAlbum, idInterpret);
END