我有一个表进程,其中包括ID (unsigned int, auto_increment)
和Name (varchar, unique)
。
使用任何输入(无论是否在表格中)选择以下功能始终会产生
错误1172(42000):结果由多行组成
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
RETURN myid;
END$$
但是,选择以下函数始终返回NULL:
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
RETURN myid;
END$$
此外,请注意以下确实返回正确的结果(数字30和50是任意的):
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
IF myid IS NULL THEN
RETURN 30;
ELSE
RETURN 50;
END IF;
END$$
任何帮助表示赞赏。
更新:已编辑以删除表列和函数参数之间的冲突。我不相信这是问题所在。
更新2:请注意,当输入参数在表中或不在表中时,以下似乎都有效。为什么在没有coalesce()的情况下,即使对于表中的输入参数,函数也会返回NULL?
CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255))
RETURNS INT UNSIGNED
BEGIN
DECLARE myid INT UNSIGNED;
SELECT ID INTO myid FROM Processes WHERE Name=nametwo;
RETURN COALESCE(myid, 0);
END$$
列名在MySql中不区分大小写,因此您可能会发现where Name = name
的意思是“给我每一行”。
尝试将输入参数更改为您的过程(以及查询中的相应条件)为srchName
或与name
不同的其他内容。
尝试将输入name
重命名为不同的名称,如inputName
。
更新:另一个建议...... qazxsw poi qazxsw poi qazxsw poi