2015-09-13 71 views
0

目前,我想在我的DATABSE创建过程与此查询:在SQL创建过程失败

CREATE PROCEDURE InsertTitle(title VARCHAR(50), interpret VARCHAR(50), album VARCHAR(50)) 
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 Interpret WHERE Name = album AND Interpret = @idInterpret); 

    INSERT INTO Lied (Name, Album, Interpret) VALUES (title, @idAlbum, @idInterpret,); 
END; 

但现在我得到以下错误,并没有告诉我任何事情:

您的SQL语法错误;检查手册中 对应于你的MySQL服务器版本正确的语法你有一个想法在我的错误是使用 “”附近的3

线?我使用MySQL服务器。

+0

使用'DELIMITER //'在顶部(和结束并适当重置) – amdixon

回答

1

首先,您的问题可能只是一个分隔符。其次,您正在接近错误地插入id的计算。您应该使用LAST_INSERT_ID()

DELIMITER $$ 

CREATE PROCEDURE InsertTitle(title VARCHAR(50), interpret VARCHAR(50), album VARCHAR(50)) 
BEGIN 
    INSERT IGNORE INTO Interpret (Name) 
     VALUES (interpret); 
    SELECT @idInterpret :-= LAST_INSERT_ID() 

    INSERT IGNORE INTO Album (Name, Interpret) 
     VALUES (@album, @idInterpret); 
    SELECT @idAlbum := LAST_INSERT_ID() 

    INSERT INTO Lied (Name, Album, Interpret) 
     VALUES (title, @idAlbum, @idInterpret); 
END; 
$$ 
DELIMITER ; 

此外,set使用=,不:=。后者仅在SELECT报表中需要。而且,在最后的VALUES()声明中还有一个额外的逗号。

+0

但是,如果插入不起作用'LAST_INSERT_ID()'会给出错误的ID或者我错了? – Cilenco

+0

@Cilenco。 。 。我认为它返回NULL(或值是未定义的)。不过,你的代码有'INSERT IGNORE',这看起来不是一个好主意。但是,获取代码解析和运行并不重要。 –

+0

好的,谢谢你。 IGNORE的替代选择是什么?你能否简要解释一下DELIMITER的功能? – Cilenco

0

尝试使用此解决方案:

delimiter // 
CREATE PROCEDURE InsertTitle(title VARCHAR(50), interpret VARCHAR(50), album VARCHAR(50)) 
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 Interpret WHERE Name = album AND Interpret = @idInterpret); 

    INSERT INTO Lied (Name, Album, Interpret) VALUES (title, @idAlbum, @idInterpret,); 
END// 
delimiter ; 

有关详细信息,请参阅:MySQL CREATE PROCEDURE