本文出自悠然品鉴小悠,转载请注明出处http://www.youranshare.com/blog/sid/105.html
之前在写网站的时候碰到一个问题,向数据库中插入记录的时候,对于unique类型的字段如果插入已经存在的记录值会出现错误: "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry”,我想了一下之前做的工程,我的解决方案是先查询一下数据库,判断一下数据库中是否存在要插入的字段值,然后在执行Add方法将数据插入,这种方法虽然也可以,但是多了一次数据库的查询操作,不利于网站的优化;今天下午我再次遇到了这种问题,因为这次的数据库关系较为复杂,多一次数据判断就增加了服务器的压力,经过一番研究找到了一种较为方便的方法,这里就记录一下.
我用一个例子来说明一下:
首先创建一个数据表create table yz_test(
id int auto_increment,
user varchar(32) unique,
PRIMARY KEY (id) )
这个数据表中 user字段是不能重复的,我们首先插入一个记录:public function Test(){
$Model = M("test");
$Data["user"]="user1";
$Model->add($Data);
}
我们第一次执行,没有问题,结果如下图:
我们再次执行,这个时候就会看到错误,原因就是user字段是unique的属性,如图所示我们的错误信息:
报了一个SQLSTATE[23000]的错误,注意错误代码是23000,我们可以根据这个错误代码做写文章,下面是我判断这种错误的方法:public function Test(){
$Model = M("test");
$Data["user"]="user1";
$Ret =-1;//操作的返回值
try{
$Ret = $Model->add($Data);//注意:如果Add有异常,$Ret的值不会被修改
}catch(\Exception $e){
if($e->getCode()==23000){
echo "插入的数据Unique导致的错误";
die();
}
}
echo "创建成功";
}
我用try catch捕获异常,提取错误代码,根据错误代码就知道了错误的愿意,从而就能一次判断数据是否能够插入了.