php

php

php相关问题
html+css

html+css

JavaScript

JavaScript

js,jquery,vue.js等
Linux

Linux

Linux操作系统
Mysql

Mysql

各种资源

各种资源

开发工具,手册等
就业指导

就业指导

UI设计

UI设计

教学视频分享

教学视频分享

mysql插入数据失败防止主键id自增的方法

刘老师 发表了文章 • 0 个评论 • 2469 次浏览 • 2018-06-08 16:46 • 来自相关话题

当我们给数据表设置自增长主键id的时候,当插入数据失败时,id也会增长,打个比方,如果当前数据表最大主键id为39,插入一条新的数据失败后,紧接着再次插入数据成功,那么主键id为41,而并不是40,插入10条数据失败,紧接着再次插入数据成功,主键id为50,即虽然插入数据失败,但是主键id依然会保持自增,这是什么原因呢?
因为mysql的存储引擎是innoDB(大部分是),他的自增是缓存在内存字典中的,即先分配,再插入,也就是说即使插入失败了,但是内存已经被分配了,不会回收,让innoDB识别到当前最大id的方法是重新开启服务来更新AUTO_INCREMENT缓存,但这显然是不可取的,那么如何实现插入失败的时候主键id不会自增呢
Mysql主键如果在insert插入时有值,将不使用自增。也就是说插入数据的时候只要自己把id加上,那么就按照插入的数进行自增了,这个数值我们可以通过代码来控制:
 

$link = mysqli_connect('localhost','root','','test');
$sql = "select max(us_id) from user";
$result = mysqli_query($link,$sql);
$num= mysqli_fetch_array($result)[0] + 1;
echo $num;
$sql1 = "INSERT INTO `user` (`us_id`,`us_name`,`us_password`) VALUES ($num,'张三','zhangsan')";
mysqli_query($link,$sql1);
mysqli_close($link);

我们可以利用函数获取当前数据表的主键id的最大值,然后在最大值的基础上加1,赋值给id,那么就会按照赋值id去插入数据。
但是这种方法并不好,在处理高并发的数据时候很容易出错(待验证),而且多一层查询,必然会影响运行效率。 查看全部
当我们给数据表设置自增长主键id的时候,当插入数据失败时,id也会增长,打个比方,如果当前数据表最大主键id为39,插入一条新的数据失败后,紧接着再次插入数据成功,那么主键id为41,而并不是40,插入10条数据失败,紧接着再次插入数据成功,主键id为50,即虽然插入数据失败,但是主键id依然会保持自增,这是什么原因呢?
因为mysql的存储引擎是innoDB(大部分是),他的自增是缓存在内存字典中的,即先分配,再插入,也就是说即使插入失败了,但是内存已经被分配了,不会回收,让innoDB识别到当前最大id的方法是重新开启服务来更新AUTO_INCREMENT缓存,但这显然是不可取的,那么如何实现插入失败的时候主键id不会自增呢
Mysql主键如果在insert插入时有值,将不使用自增。也就是说插入数据的时候只要自己把id加上,那么就按照插入的数进行自增了,这个数值我们可以通过代码来控制:
 


$link = mysqli_connect('localhost','root','','test');
$sql = "select max(us_id) from user";
$result = mysqli_query($link,$sql);
$num= mysqli_fetch_array($result)[0] + 1;
echo $num;
$sql1 = "INSERT INTO `user` (`us_id`,`us_name`,`us_password`) VALUES ($num,'张三','zhangsan')";
mysqli_query($link,$sql1);
mysqli_close($link);


我们可以利用函数获取当前数据表的主键id的最大值,然后在最大值的基础上加1,赋值给id,那么就会按照赋值id去插入数据。
但是这种方法并不好,在处理高并发的数据时候很容易出错(待验证),而且多一层查询,必然会影响运行效率。

mysql中日期类型timestamp和datetime的区别

刘老师 发表了文章 • 0 个评论 • 1763 次浏览 • 2018-06-06 14:18 • 来自相关话题

我们会经常遇到向数据库中插入日期时间的操作,最常用的日期类型一般都是date和datetime等,多用于存储用户注册日期登录日期等‘’一成不变‘’的时间,实际业务中很少会遇到需要存储类型为timestamp的,所以很多人对这个日期类型比较陌生,那么他与datetime的区别在什么地方呢?
我们运行以下代码:





其中,us_current_time字段的数据类型是timestamp,us_datetime字段的数据类型是datetime,两者的主要区别是,当时区更改时,以timestamp类型存储的时间会被自动转换成当前时区对应的时间,也就是说当这条数据被从数据库拿出的时候会被mysql自动加工处理,随时区的变化而变化,那么什么样的业务会需要这样的需求呢?
设想一下,当你与一个身处东京的朋友聊天的时候,此时正是北京时间9点整,如果你们聊天的当前时间保存类型不是timestamp,那么他所说的话在你这里显示的是上午10点钟,从未来而来,出鬼了么…… 查看全部
我们会经常遇到向数据库中插入日期时间的操作,最常用的日期类型一般都是date和datetime等,多用于存储用户注册日期登录日期等‘’一成不变‘’的时间,实际业务中很少会遇到需要存储类型为timestamp的,所以很多人对这个日期类型比较陌生,那么他与datetime的区别在什么地方呢?
我们运行以下代码:

微信图片编辑_20180606140920.jpg

其中,us_current_time字段的数据类型是timestamp,us_datetime字段的数据类型是datetime,两者的主要区别是,当时区更改时,以timestamp类型存储的时间会被自动转换成当前时区对应的时间,也就是说当这条数据被从数据库拿出的时候会被mysql自动加工处理,随时区的变化而变化,那么什么样的业务会需要这样的需求呢?
设想一下,当你与一个身处东京的朋友聊天的时候,此时正是北京时间9点整,如果你们聊天的当前时间保存类型不是timestamp,那么他所说的话在你这里显示的是上午10点钟,从未来而来,出鬼了么……

php插入mysql数据库出现中文乱码问题的解决

刘老师 发表了文章 • 0 个评论 • 1922 次浏览 • 2018-06-06 11:40 • 来自相关话题

昨天在给别人讲知识的时候翻车了,尴尬的是车翻了没有及时的扶起来,所幸最终找到了问题所在,情况是这样的:
 
在数据库test的user表中插入一条数据:

 $link = mysqli_connect('localhost','root','','test');
if(mysqli_connect_errno($link)){
    die("<h2 style='color:red;'>连接失败</h2>".mysqli_connect_error($link));
}else{
    echo '<h2>连接成功</h2>';
}
$sql = "INSERT INTO `user` (`us_name`,`us_password`) VALUES ('张三','zhangsan')";
if(mysqli_query($link,$sql)){
    echo '成功的添加了'.mysqli_affected_rows($link).'条记录,新增主键id'.mysqli_insert_id($link);
}else{
    echo '添加失败'.mysqli_error($link);}
mysqli_close($link);

 
能够插入成功,但是出现乱码情况,如图




然后在代码中添加
//规定html页面字符集
header('Content-type:text/html;charset=utf-8');和
//规定客户端字符集
mysqli_set_charset($link,'utf-8');
并没有解决问题,插入的中文依旧是乱码,这两行代码一个是规定HTML页面编码,一个是规定PHP编码,由此可以知道,一定是mysql服务端的编码出现问题,我们运行以下命令:
mysql>show variables like 'char%'




可以看到character_set_server并不是utf8,我们可以在my.ini中更改,找到[mysqld]在下面加入
character_set_server = utf8(注意:在mysql版本5.5以下可以设置default-character-set = utf8 ,而高于5.5的版本已经废除了default-character-set,会出现wamp启动不成功的错误),然后关闭wamp,再开启,不能重启
我们再运行以下命令,会发现character_set_server已经改成了utf8
mysql>show variables like 'char%'




我们再运行插入语句,即可发现,插入成功而且不会乱码 查看全部
昨天在给别人讲知识的时候翻车了,尴尬的是车翻了没有及时的扶起来,所幸最终找到了问题所在,情况是这样的:
 
在数据库test的user表中插入一条数据:


 $link = mysqli_connect('localhost','root','','test');
if(mysqli_connect_errno($link)){
    die("<h2 style='color:red;'>连接失败</h2>".mysqli_connect_error($link));
}else{
    echo '<h2>连接成功</h2>';
}
$sql = "INSERT INTO `user` (`us_name`,`us_password`) VALUES ('张三','zhangsan')";
if(mysqli_query($link,$sql)){
    echo '成功的添加了'.mysqli_affected_rows($link).'条记录,新增主键id'.mysqli_insert_id($link);
}else{
    echo '添加失败'.mysqli_error($link);}
mysqli_close($link);


 
能够插入成功,但是出现乱码情况,如图
1528251785(1).png

然后在代码中添加
//规定html页面字符集
header('Content-type:text/html;charset=utf-8');和
//规定客户端字符集
mysqli_set_charset($link,'utf-8');
并没有解决问题,插入的中文依旧是乱码,这两行代码一个是规定HTML页面编码,一个是规定PHP编码,由此可以知道,一定是mysql服务端的编码出现问题,我们运行以下命令:
mysql>show variables like 'char%'
微信图片编辑_20180606104230.jpg

可以看到character_set_server并不是utf8,我们可以在my.ini中更改,找到[mysqld]在下面加入
character_set_server = utf8(注意:在mysql版本5.5以下可以设置default-character-set = utf8 ,而高于5.5的版本已经废除了default-character-set,会出现wamp启动不成功的错误),然后关闭wamp,再开启,不能重启
我们再运行以下命令,会发现character_set_server已经改成了utf8
mysql>show variables like 'char%'
微信图片_20180606115600.png

我们再运行插入语句,即可发现,插入成功而且不会乱码
123.png