美文网首页
WCDB主键为NULL的问题分析

WCDB主键为NULL的问题分析

作者: 落影loyinglin | 来源:发表于2024-01-13 09:23 被阅读0次

问题背景

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


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

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

下面一一分析疑问点。

问题分析

bookListId是否为主键

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


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

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执行错误报错为:

[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

相关文章

  • 2-12 初涉主键约束

    PRIMARY KEY 主键约束 每张数据表只能存在一个主键 主键保证记录的唯一性 主键自动为NOT NULL

  • MySQL学习日记(12)主键约束

    主键约束 PRIMARY KEY 每张数据表中只能存在一个主键 主键保证记录的唯一性 主键自动为NOT NULL ...

  • SQL Server 2016 表操作:修改、删除表结构

    一、修改表结构 修改字段类型长度 修改字段类型 修改是否为空的约束(NULL / NOT NULL) 添加主键 修...

  • MySQL NOT EXISTS优化

    测试发现 not extis耗时比较久,选择左关联后 d表主键为null的条件(d.xid is null)得到优...

  • Mysql知识点整理

    索引相关 索引类型 主键索引:数据列不允许重复,不允许为NULL。一个表只能有一个主键索引。InnoDB的主键索引...

  • 联合主键,及视图子表null值问题

    子表为空,但子表的FID不为null,导致根据主表字段查出来的值也为null解决方法:添加联合主键 (在view视...

  • MySQL索引结构类型

    索引的类别包括- 主键索引( PRIMARY ):数据列不允许重复,不允许为NULL.一个表只能有一个主键。 唯一...

  • MyBatis Plus之主键为uuid设计为Long型带来的问

    以Google浏览器为例说明 一、问题与分析回溯 1、MySQL中表t_user的主键(id)设计为bigint(...

  • mysql 约束

    主键约束表的主键设计策略任意两行都不具备相同的主键值每行都必须有一个主键值(主键不允许null列)主键和业务无关,...

  • spingboot遇到注入为null的坑

    注入为null主要有几个原因: 注入的实现类主键上没有加@@Component或@Service等注解。 使用注入...

网友评论

      本文标题:WCDB主键为NULL的问题分析

      本文链接:https://www.haomeiwen.com/subject/fmjxodtx.html