'执行失败:(1062)关键'Y'的重复输入'X'是什么意思?

时间:2012-08-31 20:42:32

标签: mysql mysqli

我正在尝试将X添加到我的数据库中的某个表中,但是我收到此错误。即使表中不存在X,它也会说它就在那里。虽然X被添加到数据库中,但我想摆脱这个错误。我不知道它是否相关,但我使用的是Mysqli的预处理语句,并使用$statement->errno." ".$statement->error打印此错误。有人可以向我解释一下吗?感谢。

更新:这是代码:X = USER_USERNAME

$stmt = $mysqli->prepare("INSERT INTO USERS (USER_USERNAME, USER_EMAIL, USER_BIRTHDAY, USER_PASSWORD, USER_SALT, USER_IP, USER_ACTIVATION_CODE) VALUES (?,?,?,?,?,INET_ATON(?),?)");
            $stmt->bind_param('sssssss',$username,$email,$date,$hashed_password,$salt,$IP,$activation_code);
            $stmt->execute();
            if (!$stmt->execute()) {
                echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
            }
            else {
                echo "ok";
            }

显示创建表用户:

 CREATE TABLE `USERS` (
 `USER_ID` int(11) NOT NULL AUTO_INCREMENT,
 `USER_FIRSTNAME` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
 `USER_LASTNAME` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
 `USER_USERNAME` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
 `USER_PASSWORD` varchar(128) CHARACTER SET utf8 DEFAULT NULL,
 `LEVEL_ID` int(11) NOT NULL,
 `USER_BIRTHDAY` date DEFAULT NULL,
 `USER_EMAIL` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
 `USER_GENDER` enum('M','W','U') CHARACTER SET utf8 DEFAULT NULL,
 `USER_COUNTRY` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
 `USER_LOCATION` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
 `USER_ADDRESS` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
 `USER_HOUSENUMBER` varchar(8) CHARACTER SET utf8 DEFAULT NULL,
 `USER_AVATAR` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
 `USER_REGISTRATION_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `USER_ACTIVATION_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `USER_STATUS` enum('REGISTERED','ACTIVE','BANNED','NONACTIVE') CHARACTER SET utf8 DEFAULT NULL,
 `USER_BANNED_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `USER_LATEST_LOGIN` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `USER_EXP` bigint(20) DEFAULT NULL,
 `USER_DESCRIPTION` text CHARACTER SET utf8,
 `USER_ACTIVATION_CODE` varchar(32) CHARACTER SET utf8 NOT NULL DEFAULT '0',
 `USER_SALT` varchar(15) CHARACTER SET utf8 NOT NULL,
 `USER_IP` int(10) NOT NULL,
 `USER_REMEMBER_KEY` varchar(32) CHARACTER SET utf8 NOT NULL,
 PRIMARY KEY (`USER_ID`),
 UNIQUE KEY `USER_USERNAME` (`USER_USERNAME`),
 UNIQUE KEY `USER_EMAIL` (`USER_EMAIL`),
 KEY `LEVEL_ID` (`LEVEL_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=latin1

4 个答案:

答案 0 :(得分:1)

您可能正在尝试插入具有ID(或其他某个字段)1集的记录,而此类记录已存在于表中。作为主键的字段必须具有每个记录的唯一值。

您可以尝试进行简单的错误检查以避免此错误:

$rows = mysql_query("SELECT X from tablenme WHERE X = Y;");

if(mysql_num_rows($rows) > 0){
    echo 'Error Messege';
}else{
    insert...
}

其中X是主键或外键列,Y是要插入该列的值。

编辑:可能导致此问题的一些问题可能是您没有在insert语句中指定某些不能为null的列。 与LEVEL_IDUSER_REMEMBER_KEY一样。它们设置为NOT NULL,但未使用insert语句插入值。

当第一列为'sssssss'且其对应值为USER_USERNAME时,我也不明白为什么要插入$username。请检查一下。

SQL Fiddle

答案 1 :(得分:0)

那是因为您试图插入或更新违反约束的值(例如PK或UK),例如

如果你的桌子有ID,它是PK或唯一钥匙,你只能有一个独特的价值......不可能没有重复....

使用唯一键,您可以使用Null ...但不要在同一列中重复值,因为您将破坏约束...有关详细信息,请查看http://dev.mysql.com/doc/refman/5.0/es/constraints.html

答案 2 :(得分:0)

如果您收到该错误,则表中存在X 。显然你没有注意到它,但它就在那里。 (检查修剪空格和区分大小写等内容。)

如果您没有在phpMyAdmin中收到错误,那么您认为发送的查询实际上并不是您要发送的查询。很可能您为该字段发送空白,并且在您执行一次之后,所有进一步的查询都使用相同的空白值。

最简单的检查方法是从表中删除所有内容(如果需要,请先将其复制到其他位置)。然后运行查询,看看实际插入了什么以及插入的内容。

答案 3 :(得分:0)

您已经定义了主要唯一键,但您又尝试插入相同的值。那个时候因为已经存在相同的值,所以不可能为主键或唯一键设置冗余值。

就是这样的。假设您有一个包含idname的表格,其中idprimary key。您将第一行插入:

INSERT INTO `users` (`id`, `name`) VALUES (1, 'Praveen');
INSERT INTO `users` (`id`, `name`) VALUES (1, 'Kumar');

第二个查询违反了id唯一性。

解决方案:尝试截断表,然后再次运行查询(如果可能的话)。

尝试

的一些步骤
  1. 检查是否还违反了具有唯一约束的其他字段。
  2. 查看生成的查询。
  3. 将相同的查询放入 phpMyAdmin 并检查。