前言
今年研一,参加了学校挑战杯,项目中需要完成一个登陆及注册页的制作,登陆和注册页代码参考了网络资源,遇到数据库连接完成,却不能把数据写入数据库的问题,研究了一下午最后终于解决。
一、项目配置
登陆注册页面在Adobe Dreamweaver上用html+css+js完成,数据库等环境用wampserver集成环境。
二、出现问题
网页同数据库连接成功,但用户注册、登录页面的数据不能正常写入数据库中。
三、问题解决
一开始以为是代码出现了问题,查了一下午的相关代码,发现符合。查阅其他资料时,发现有很多人提到关于数据库中关于主键设置自增的问题,查阅了如何设置主键自增后,设置自增,问题解决,自己真是一个大冤种。
四、相关概念
在问题解决之前,先了解一些相关的基本概念。
主键、外键
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组能唯一标识一条记录,该属性组就可以成为一个主键。
例:
学生表(学号,姓名,性别,班级)
其中每一名学生的学号是唯一的,学号是一个主键。
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键。
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一识别一条记录,学号和课程号的组合才能唯一标识一条记录,所以学号和课程号的属性组是一个主键。
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键。
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份证号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都有可能重复,所以身份证号是主键。
2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那它就可以是A表的外键。
主键自增
InnoDB引擎的自增值,其实是保存在内存里,并且到了MySQL8.0版本之后,才有了自增值持久化的能力。也就是实现了如果发生重启后,表的自增值可以恢复为MySQL重启前的值。
在MySQL5.7及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值max(id),然后将max(id)+1作为这个表当前的自增值。
在MySQL8.0版本,将自增值的变更记录在redo log日志中,重启的时候依靠redo log日志恢复重启之前的值。
自增值修改机制
1.如果插入数据时id字段指定为0、null、或未指定值,那么就把这个表当前的AUTO_INCREMENT值填到自增字段;
2.如果插入数据时id字段制定了具体的值,就直接使用语句里指定的值
自增值新增机制
1.如果准备插入的值>=当前自增值,新的自增值就是准备插入的值+1;
2.否则,自增值不变。
为什么自增主键不连续
-
在MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化
-
事务回滚(自增值不能回滚,因为并发插入数据时,回滚自增ID可能会造成主键冲突)
-
唯一键冲突(由于表的自增值已变,但是因为主键发生冲突没插进去,下一次插入主键值=现在变化了的自增值+1,所以不连续)
五、方法介绍
在添加字段的时候,设置id为主键,并且在上图方框示意处打勾,即主键自增。选择后,网页数据可正常写入数据库。
总结
以上就是今天要讲的内容,本文简单介绍了主键的相关知识,并且讲述了如何设置主键自增。
参考文献
1.数据库主键的含义
https://www.cnblogs.com/rainbow-1/p/13907272.html
2.主键自增理解
hhttps://blog.csdn.net/ag1412/article/details/122746348