在我的MySQL数据库中,我有一个表"table1",在列"name"上设置了唯一约束-我想防止重复的名称。
如果表中已经有名字'John',则此代码:
$db=new mysqli(...);
$sql="INSERT INTO table1 SET id=10,name='John'";
if(!$db->query($sql))
{
if($db->errno==1062)
{
throw new InsertNonUniqueException(...);
}
else
{
throw new InsertException(...);
}
}
应该抛出insertUnonnequeException()(我自己的异常)。相反,它抛出InsertException()。
查询的执行返回false,执行进入if()循环。另外$db-
我不知道为什么当发生唯一密钥约束冲突时,mysqli不返回1062代码!
第一步
确保表有唯一的键
SHOW CREATE TABLE table1
预期结果
CREATE TABLE `table1` (
`id` INT(11) default NULL,
`name` varchar(11) COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci
如果存在唯一密钥名称(name)
我们有一个唯一密钥
步骤二
试着改变你的代码
$db = new mysqli(...);
// first insert
if( !$db->query("INSERT INTO table1 (id, name) VALUES (10, 'John')") ) {
throw new Exception($db->error);
}
// second insert (for me raise: Duplicate entry 'John' for key 'name')
if( !$db->query("INSERT INTO table1 (id, name) VALUES (11, 'John')") ) {
throw new Exception($db->error);
}
请尝试这两个步骤
旁注:如果您的姓名和id是重复的,则消息中将只返回遇到的第一个重复项。
我是这里唯一一个认为您的SQL语法有错误的人吗?。。INSERT-INTO
中没有SET
的空间,因为您只能在UPDATE
语句中使用SET
(假设您拥有5.5版或更低版本的MySQL)。
INSERT INTO
语法如下(如文档中所述):
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
或
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
像这样试试:
<?php
$sql="INSERT INTO table1 (id, name) VALUES ('10', 'John')";
...
我不能留下任何评论,所以我想在这里问你。
请提供SHOW CREATE TABLE TABLE 1的结果
我不能使用您的代码和下一个表再现您的问题:
CREATE TABLE `table1` (
`name` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
在try/catch块中有三个sql查询。Autocommit是关闭的,并且所有三个查询都没有错误地运行,我已经验证了这一点(如果任何查询失败,它应该不会到达commit行,但是我已经通过xdebug验证了它,一次单步执行代码一行)。当代码到达commit()函数调用时,mysqli返回false,但没有错误消息。当前面的查询都工作时,提交怎么会失败呢? 代码基本上是这样的:
我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?
我有一个像这样的mysql表 但是我无法用这个函数检索“成人”和“儿童”的值 错误日志显示变量被正确地传递给函数: 为什么此函数返回?
我在MVC应用程序中使用Ajax来在您单击注销按钮时发送回一个帖子。我想将用户送回登录页面,并将他们路由到控制器中的HttpPost方法。但是,在我的Ajax代码中,当我单击注销时会出现一个错误:找不到网址:http://localhost/myapp/error/error?code=22 PageHeader.cshtml AccountController.cs
我试图开发一个android应用程序使用华为网站套件。我现在正在跟踪这个codelab:https://developer.huawei.com/consumer/en/codelab/hmssitekit/index.html#0我完全按照codelab说的做了一切,但是当我运行我的应用程序时,它抛出了一个错误,在日志中它说“错误代码6” 以前有人收到过同样的错误并解决了吗?请帮帮我
基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par