当记录以下划线开头时,重复输入错误

时间:2012-01-25 16:27:29

标签: mysql sql perl

我有一个Perl脚本,它调用MySQL中的存储过程。存储过程非常简单,它会检查是否存在记录,如果存在则更新它。如果记录不存在,它将创建它。基本代码如下所示:

DELIMITER $$

CREATE DEFINER=`me`@`%` PROCEDURE `updateClientUsage`(IN inDate DATE, IN inPort SMALLINT(4), IN inOwner VARCHAR(255), IN inName VARCHAR(255), IN inEmailed TINYINT(1))
BEGIN
    IF EXISTS(SELECT * FROM client_usage WHERE port = inPort AND name = inName) THEN
        UPDATE client_usage SET date = inDate, emailed = '0' WHERE port = inPort AND name = inName;
    ELSE
        INSERT INTO client_usage (date, port, owner, name, emailed) 
        VALUES (inDate, inPort, inOwner, inName, inEmailed);
    END IF;
END

当我运行我的脚本时,它可以正常工作,直到此过程尝试更新以下划线开头的记录(名称字段以下划线开头)。我收到一个重复条目的错误。 有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

仅当portname上有唯一索引或主键时,此功能才有效。如果在其他列上定义了主键或唯一索引,即使在您选中WHERE port = inPort AND name = inName之后,您也可能会获得重复的键。

答案 1 :(得分:0)

不需要条件,因为它可以在where子句中指定(测试是相同的)

   UPDATE client_usage 
      SET date = inDate, emailed = '0'
    WHERE port = inPort AND name = inName
       ;

   INSERT INTO client_usage (date, port, owner, name, emailed) 
   VALUES (inDate, inPort, inOwner, inName, inEmailed)
   WHERE NOT EXISTS(SELECT *
        FROM client_usage 
       WHERE port = inPort AND name = inName
       )
       ;

'name'也恰好是mysql中的保留字吗?避免它。