前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WCDB主键为NULL的问题分析

WCDB主键为NULL的问题分析

作者头像
落影
发布于 2024-01-15 00:16:31
发布于 2024-01-15 00:16:31
19400
代码可运行
举报
文章被收录于专栏:落影的专栏落影的专栏
运行总次数:0
代码可运行

问题背景

最近遇到一个奇怪的业务问题,分析后发现是DB插入了bookListId为NULL的数据,并导致重复写入的问题。

可以拆分出来以下几个问题:

  • bookListId是否为主键?
  • 主键为NULL的数据是否允许插入?
  • 主键为NULL的记录为什么有多行记录?

下面一一分析疑问点。

问题分析

bookListId是否为主键

首先检查代码实现,bookListId有声明主键。

下载沙盒的DB文件看建表语句,bookListId确实为主键。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE IF NOT EXISTS "BookListTable" (
  "bookListId" text PRIMARY KEY,
  "topicId" text,
  "topicName" text,
  "bookCount" integer,
  "topicStatus" integer,
  "topicSchema" text,
  "subscribeTime" integer,
  "lastClickTime" integer,
  "lastOperationTime" integer,
  "deleteTime" integer,
  "isDel" integer,
  "hasSync" integer,
  "bookListType" integer DEFAULT(1),
  "userInfo" text,
  "recommendText" text,
  "authorId" text,
  "authorName" text,
  "authorAbstract" text,
  "authorPicUrl" text,
  "backgroundPicUrl" text,
  "secondaryInfos" text
);

主键为NULL的数据是否允许插入

在查看表结构的时候,可以发现主键这里是允许为NULL的。

尝试复现,方式很简单: 直接在insertOrReplaceObject:bookListData这段插入代码,将bookListData的bookListId属性改为nil,然后执行这段代码。果然成功。

尝试查看端上其他DB的设置,也存在类似的问题,如法炮制可以制造主键为空的数据。

主键为NULL的记录为什么有多行记录

复习了一下数据库原理:NULL是一个特殊的值,不同于其他所有的值(包括NULL)。 于是在允许插入NULL的情况下,insertOrReplaceObject会判断新的NULL记录与旧的NULL记录不相同,于是产生多个数据记录。

问题修复

既然已经知道是NULL的原因,那么设置属性为NOT_NULL即可。

实测效果,再次插入主键值为nil的时候,result返回错误。sql执行错误报错为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2024-01-11 +8.0 16:26:37.350][69592:105553151440640][E][sswcdb][SSWCDBMonitor+Error.mm,-[SSWCDBMonitor(Error) setupDBErrorMonitor]_block_invoke,33] db (null) report error Code:1, Type:Warning, Msg:Inserting with an empty/nil object
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!
最近刚入职一个新团队,还没来得及熟悉业务,甲方爸爸就要求项目要在2个月内完成开发并上线!
Java极客技术
2022/12/04
5120
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!
【大厂技术内幕】字节跳动原来是这么做数据迁移的!
因为MySQL保存着我们爬取的以及自建的数据,对于爬取的数据,数据量比较大,使用mysql 存储会影响mysql的性能,并且我们需要对数据进行流式计算,对数据进行各种统计,mysq满足不了我们的需求,我们就将mysql中的全量数据同步到HBASE中,由HBASE保存海量数据,mysql中的全量数据会定期进行删除。
JavaEdge
2021/12/07
7370
【大厂技术内幕】字节跳动原来是这么做数据迁移的!
关于flask入门教程-图书借阅系统-数据库设计和ORM映射
数据库设计是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。
python与大数据分析
2022/03/11
5750
关于flask入门教程-图书借阅系统-数据库设计和ORM映射
SpringBoot测试系列 - 处理数据库自增主键
在keywords表中,'id' 是主键,并且在定义中有auto_increment,表明其是自增主键。
Antony
2020/12/01
1.4K0
嵌入式linux之go语言开发(八)存储模块的封装(二)
由于在终端上,不需要执行复杂的sql查询,多表级联查询等。就是用来存储记录的,因此设计为存储到表里的都为二进制的字节流。
杨永贞
2020/08/04
5090
insert事务产生duplicate key error引发的死锁分析
先看程序报错: 2017-06-12 21:18:40.856 [ForkJoinPool.commonPool-worker-12] ERROR com.jd.gms.maindata.accurate.service.impl.FixServiceImpl[51] - FixServiceImpl.fixSkuAttribute error java.lang.RuntimeException: org.springframework.dao.DeadlockLoserDataAcces
MySQL轻松学
2018/03/09
3.1K0
insert事务产生duplicate key error引发的死锁分析
Android四大组件之ContentProvider
Hi,大家好,我们又双叒叕见面啦,为了让大家快速的学习Android知识,我们每天都在更新文章,相信小伙伴们已经开始眼熟我们了!这一期我们讲解ContentProvider(内容提供者)相关知识,他也是我们近期更新的Android四大组件中最后一个。话不多说,让我们赶紧开始学习吧~
下码看花
2019/09/02
6620
Android四大组件之ContentProvider
Mybatis 框架实战(上)
(2)log4j.properties https://blog.csdn.net/sinat_30185177/article/details/73550377
Jingbin
2019/04/17
3190
Hibernate配置文件hbm主键的generator可选项
1、自动增长identity 适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用) 数据库中的语法如下: MySQL:create table t_user(id int auto_increment primary key, name varchar(20)); SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));
leehao
2025/02/10
1300
[iOS学习笔记]·FMDB:第三方本地数据库处理框架(官方文档翻译篇)
创建FMDatabase对象时参数为SQLite数据库文件路径。该路径可以是以下三种之一:
陈满iOS
2018/09/10
1.4K0
[iOS学习笔记]·FMDB:第三方本地数据库处理框架(官方文档翻译篇)
28.MyBatis应用分析与最佳实践
第四步,execute方法执行SQL。execute方法返回一个ResultSet结果集。
编程之心
2020/08/12
1.2K0
28.MyBatis应用分析与最佳实践
SQLite3 笔记
使用 create table 的这种形式,自增长字段在新表中创建,索引也不会创建,UNIOUE约束都不会被创建。
py3study
2020/01/14
2.1K0
在 Swift 中使用 SQL 组合人员和地址数据
在本篇文章中,我们将讨论如何结合两个表——Person 和 Address,以便生成包含每个人的姓名和地址信息的结果表。如果某人的地址信息不存在,则对应的城市和州返回为 null。我们将用 Swift 和 SQLite 数据库实现这一功能,并详细分析其逻辑。
Swift社区
2025/01/27
1350
在 Swift 中使用 SQL 组合人员和地址数据
Java中有关Null的9问题
Java中有关Null的9问题 对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java。 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针、操作符重载、多继承实现的原因,null却与此正好相反。好吧,我真的不知道这个问题
用户1289394
2018/02/26
1.3K0
【D2RQ】:D2RQ Mapping Language
知识抽取是指从不同来源、不同结构的数据中进行知识提取,提取出数据内涵的事实性信息并供给知识图谱做进一步加工处理后会形成知识,存入到知识图谱。
WEBJ2EE
2021/09/02
1.6K0
【D2RQ】:D2RQ Mapping Language
故障分析 | 从库并行回放死锁问题分析
爱可生服务团队成员,负责处理客户在 MySQL 日常运维中遇到的问题;擅长处理备份相关的问题,对数据库相关技术有浓厚的兴趣,喜欢钻研各种问题。
爱可生开源社区
2021/01/13
1.1K0
Gorm实战,轻松掌握数据库增删改查技巧!
CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建、查询、更新和删除操作。
贾维斯Echo
2024/01/12
3.6K0
实现一个简单的Database4(译文)
译注:cstsck在github维护了一个简单的、类似SQLite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第四篇,主要是使用rspec对目前实现的功能进行测试并解决测试出现BUG
GreatSQL社区
2023/02/23
1.6K0
第37次文章:数据库基本语法
本周我们结束了最为复杂的dql语法,完成最后一个进阶9—联合查询,然后进入剩下的dml和ddl语法介绍。一起来看看吧~
鹏-程-万-里
2019/09/27
1.3K0
第37次文章:数据库基本语法
学习gorm系列八:探秘gorm.Save函数
理由:在row中没有对应的主键Id字段,所有只做插入操作。这跟gorm.Create行为是一样的。
Go学堂
2023/11/27
2.2K1
学习gorm系列八:探秘gorm.Save函数
推荐阅读
相关推荐
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验