解决mysql插入数字都变成2147483647的方法 Duplicate entry ‘2147483647‘ for key ‘PRIMARY‘ 详解mysql的数据类型
这里写目录标题
问题
今天使用mybatis开发,在向manager表中添加数据时,遇到了这样的问题:
SQL: insert into manager (
name, mobile, franchiseeId, userId,roleCategory, status,createTime, updateTime
) values (?, ?,?, ?,?, ?,?, ?)
Cause:
java.sql.SQLIntegrityConstraintViolationException:
Duplicate entry '2147483647' for key 'PRIMARY';
分析问题
Duplicate entry '2147483647' for key 'PRIMARY'
翻译成中文就是主键重复了
于是,查询数据表中是否存有id=2147483647
的记录,发现存在这条记录。
id = 2147483647
,为什么就无法插入数据呢?我们不得不去考虑mysql的数据类型。
详解mysql数据类型
整型(xxxint)
-
tinyint(m) 1个字节表示(-128~127)
-
smallint(m) 2个字节表示(-32768~32767)
-
mediumint(m) 3个字节表示(-8388608~8388607)
-
int(m) 4个字节表示(-2147483648~2147483647)
-
bigint(m) 8个字节表示(±9.22*10的18次方)
id = 2147483647
正好达到了int(m)
最大值,而我们数据表的id的字段类型
正好是int类型
,因而,无法继续写入数据了。
但我们的数据量不大,不至于会达到最大值,是不是数据库做了什么更改,在下文会继续分析。
浮点型(float和double)
-
float(m,d) 单精度浮点型,8位精度(4字节),m是十进制数字的总个数,d是小数点后面的数字个数
-
double(m,d) 双精度浮点型,16位精度(8字节)
参数m只影响显示效果,不影响精度,d却不同,会影响到精度。比如设一个字段定义
定点数(decimal)
decimal(m,d)定点类型浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
参数m是定点类型数字的最大个数(精度),范围为0~65
,d小数点右侧数字的个数,范围为0~30
,但不得超过m。
对定点数的计算能精确到65位数字。
字符串(char,varchar,xxxtext)
-
char(n) 固定长度的字符串,最多255个字符
-
varchar(n) 固定长度的字符串,最多65535个字符
-
tinytext 可变长度字符串,最多255个字符
-
text 可变长度字符串,最多65535个字符
-
mediumtext 可变长度字符串,最多2的24次方-1个字符
-
longtext 可变长度字符串,最多2的32次方-1个字符
二进制数据(xxxBlob)
XXXBLOB
相对于xxxtext
来说的。
他们的存储方式不同,xxxTEXT
是以文本方式存储的,如果存储英文的话区分大小写,而xxxBlob
是以二进制方式存储的,不区分大小写。
xxxBlob
存储的数据只能整体读出。
xxxTEXT
可以指定字符集,xxxblob
不用指定字符集。
日期时间类型(date,time,datetime,timestamp)
-
date 日期’2008-12-2’
-
time 时间’12:25:36’
-
datetime 日期时间’2008-12-2 22:06:44’
-
timestamp 不固定
timestamp比较特殊,如果定义字段的类型为timestamp,这个字段的时间会在其他字段修改的时候自动刷新。所以这个数据类型的字段可以存放这条记录最后被修改的时间,而不是真正来存放时间。
数据类型的属性
-
NULL 数据列可包含NULL值
-
NOT NULL 数据列不允许包含NULL值
-
DEFAULT xxx 默认值,如果插入记录的时候没有指定值,将取这个默认值
-
PRIMARY KEY 主键
-
AUTO_INCREMENT 递增,如果插入记录的时候没有指定值,则在上一条记录的值上加1,仅适用于整数类型
-
UNSIGNED 无符号
-
CHARACTER SET name 指定一个字符集
解决问题
上文中也提到了id达到了最大值,但为什么会达到最大值呢?
于是,查询这个id的上条记录的id=400
,但manager表是自动增加的,因而,这条记录应该是 id = 401
。
通过上面的分析,只能是MySQL的配置问题,有可能是 auto Increment = 2147483647
,于是,去查看manager表的配置:
果然是配置的问题,可能其他研发人员误操作,修改auto increment
的值,于是,把该值修改为401,auto increment ,实际上是随着表中的id的改变而自动改变的。**
总结
经过这个问题,学习了mysql的数据类型。
你学废了mysql的数据类型吗?
相关文章
- mysql如何进行分区_mysql如何进行分区_mysql分区有哪些方法「建议收藏」
- MySQL配置路径指南:步骤详解(mysql中目录设置)
- MySQL中获取当前日期的方法(mysql中当前日期)
- 添加MySQL表外键的步骤(mysql给表添加外键)
- MySQL存储二进制数据的方法(mysql二进制数据)
- MySQL中的求和函数详解(mysql的求和函数)
- MySQL的锁原理详解(mysql锁原理)
- MySQL自动递增——轻松管理数据表唯一标识符(mysql自动递增)
- 步骤简明,轻松学会MySQL密码修改方法(mysql改密码)
- 修复Linux下MySQL忘记密码的技巧(linux忘记mysql密码)
- MySQL中的无符号整型简介(mysql无符号整型)
- 深入了解MySQL中int8类型的使用方法(mysql中int8类型)
- c MySQL中批量删除记录的方法(c mysql删除记录)
- MySQL 实现两表连接索引的方法(mysql 两表连接索引)
- 批量导入MySQL数据库的简单方法(batch导入mysql)
- MySQL 运用分组函数让数据透析更方便(5 mysql中分组函数)
- 快捷方便使用csv快速导入MySQL数据库(.csv导入mysql)
- 解决MySQL不去除重复记录问题的方法(mysql不去除重复记录)
- MySQL下载及账号密码获取方法简介(mysql 下载账号密码)
- MySQL授予权限方法简介(mysql下赋予权限)