我有一个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
当我运行我的脚本时,它可以正常工作,直到此过程尝试更新以下划线开头的记录(名称字段以下划线开头)。我收到一个重复条目的错误。 有谁知道为什么会这样?
答案 0 :(得分:1)
仅当port
和name
上有唯一索引或主键时,此功能才有效。如果在其他列上定义了主键或唯一索引,即使在您选中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中的保留字吗?避免它。