3

我有一个表 Processes,它由一个ID (unsigned int, auto_increment)和组成Name (varchar, unique)

使用任何输入(无论是否在表中)选择以下函数总是会导致

ERROR 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$$

任何帮助表示赞赏。

更新:编辑以消除表列和函数参数之间的冲突。我不相信这是问题所在。

UPDATE2:请注意,无论输入参数是否在表中,以下内容似乎都有效。为什么在没有 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$$
4

2 回答 2

0

MySql 中的列名不区分大小写,因此您可能会发现这where Name = name意味着“给我每一行”。

尝试将输入参数更改为您的过程(以及查询中的相应条件)为srchName或其他不同于name.

于 2012-10-24T22:06:40.967 回答
0

尝试将输入重命名name为不同的名称,例如inputName.

更新:另一个建议。

DECLARE myid INT UNSIGNED;
SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;
于 2012-10-24T22:07:58.653 回答