Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 记录以下划线开头时出现重复条目错误_Mysql_Sql_Perl - Fatal编程技术网

Mysql 记录以下划线开头时出现重复条目错误

Mysql 记录以下划线开头时出现重复条目错误,mysql,sql,perl,Mysql,Sql,Perl,我有一个在MySQL中调用存储过程的Perl脚本。存储过程非常简单,它检查记录是否存在,如果存在则更新。如果记录不存在,它将创建它。基本代码如下所示: DELIMITER $$ CREATE DEFINER=`me`@`%` PROCEDURE `updateClientUsage`(IN inDate DATE, IN inPort SMALLINT(4), IN inOwner VARCHAR(255), IN inName VARCHAR(255), IN inEmailed TINYI

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

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

只有在
端口
名称
上有唯一索引或主键时,这才有效。如果在其他列上定义了主键或唯一索引,则即使在检查了
其中port=inPort和name=inName之后,也可能会得到重复的键,因此不需要该条件,因为可以在WHERE子句中指定它(测试相同)


“name”在mysql中也是一个保留字吗?避免它。

您能发布准确的错误消息吗?另外,如果出现重复错误,是否确定它正在尝试更新而不是插入?桌子上有什么限制吗?如果是的话,它们是什么?我认为它正在尝试在应该更新的时候插入。错误消息是:DBD::mysql::st execute failed:Duplicate entry“\u ClientThatStartsWithUnderline”这可能是另一个问题,但是您将字符串
'0'
分配给
Emaild
,但参数
InEmaild
声明为
TINYINT(1)
.Hmm,我更改了emailed和其他一些字段的数据类型,以匹配它们在表中的内容,这似乎已经解决了它。Part和Name是我的两个主键。我可以通过更改inDate、inName等的数据类型来修复它。。。匹配表中的数据类型。语法错误。MySQL不支持
INSERT。。。价值观其中
。此外,OP的问题是在
(端口、名称)
上需要复合唯一性约束。
   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
       )
       ;