sqlite 自增列 起始值和值不连续的问题

sqlite 自增列 起始值和值不连续的问题,第1张

概述一个表中只能拥有一个自增列 如果多个列需要自增 其它的列只能通过触发器来完成列值的自增 自增列: 每次都会按顺序递增,可以保证在一个表里的主键不重复   该列类型为integer                 定义形式:定义形式不同 生成序号的规则大方向相同也有差异  各有各的优势                         1:INTEGER PRIMARY KEY AUTOINCREME

一个表中只能拥有一个自增列 如果多个列需要自增 其它的列只能通过触发器来完成列值的自增@H_404_1@


@H_404_1@

自增列: 每次都会按顺序递增,可以保证在一个表里的主键不重复 该列类型为integer
@H_404_1@

定义形式:定义形式不同 生成序号的规则大方向相同也有差异 各有各的优势
@H_404_1@

1:INTEGER PRIMARY KEY autoINCREMENT 整形 主键 自增
@H_404_1@

2:INTEGER PRIMARY KEY 整形 主键
@H_404_1@


@H_404_1@

seq值: sqlite数据库用来保存表中自增列中存储的最大自增值 新插入的记录自增值默认为该值+1 存储在sqlite_sequence表的seq列中
@H_404_1@

定义形式一:@H_404_1@

用seq列保存最大自增值 自动生成的自增值为正数 最小从1开始
@H_404_1@

想插入0和负数的自增值必须插入时手动指定
@H_404_1@

删除自增值最大那条记录或删除整个表记录时seq值不变 默认新插入的自增值为seq+1@H_404_1@


@H_404_1@

插入 *** 作:@H_404_1@

待插入的记录有自增列值并不为null时使用待插入的自增值插入
@H_404_1@

待插入的记录没有自增列值或自增列值为null时
@H_404_1@

获取seq值成功:@H_404_1@

seq值<表中自增列最大值:让表中自增列最大值+1 赋给待插入的自增列插入@H_404_1@

seq值>=表中自增列最大值:让seq值+1 赋给待插入的自增列插入
@H_404_1@

获取seq值失败:用初始值1 赋给待插入的自增列插入
@H_404_1@

插入结果:
@H_404_1@

插入失败:在自增列中有待插入的自增列值@H_404_1@

插入成功:在自增列中没有待插入的自增列值
@H_404_1@

跟新seq值:前提插入成功@H_404_1@

没有seq值:@H_404_1@

待插入的自增值<=0:seq值为0@H_404_1@

待插入的自增值>0:seq值为待插入的自增值@H_404_1@

有seq值:@H_404_1@

待插入的自增值<=seq值:seq值不变@H_404_1@

待插入的自增值>seq值:seq值为待插入的自增值@H_404_1@


@H_404_1@

delete 表 *** 作 不会修改seq值 每删除一条记录会记录到事物日志中等待回滚@H_404_1@

truncate 表 *** 作会干掉seq值 事物日志中记录删除表 *** 作 不能回滚 sqlite3不支持
@H_404_1@


@H_404_1@

在sqlite3中在逻辑上做到truncate *** 作执行以下2条语句 不过效率比truncate差@H_404_1@

一:drop掉该表 在重建@H_404_1@

二:1. delete from table 2.update sqlite_sequence set seq=0 where name='table' 或 delete from sqlite_sequence where name='table'@H_404_1@

经过测试2的效率比一微微微高@H_404_1@


@H_404_1@

定义形式二:@H_404_1@

不使用sqlite_sequence表seq列获取最大自增值 而是获取表中自增列中的最大序号
@H_404_1@

自动生成的自增值为整数(负数 0 正数)@H_404_1@

删除最大自增值那条记录或整个表记录 新插入的记录的自增值还是递增值
@H_404_1@

插入记录时没指定自增值:@H_404_1@

表中没记录 :由1开始@H_404_1@

表中有记录:自增列中最大值+1 类似于insert into table (column1,column2) values((select max(column1) from table)+1,column2value);
@H_404_1@


@H_404_1@


@H_404_1@

定义形式一:
@H_404_1@

创建含有自增列的表@H_404_1@

CREATE table music (ID INTEGER PRIMARY KEY autoINCREMENT,name TEXT,author TEXT,note TEXT,ower_ID INTEGER );
@H_404_1@

插入若干条记录@H_404_1@

insert into music (name,author,note,ower_ID) values ('aaaa',"bbb","ccc",111)@H_404_1@

insert into music (name,111)@H_404_1@

查看表中记录和seq值@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
3 3 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@

RecNo name seq
1 music 3
@H_404_1@

删除自增值最大那条记录 查看表中记录和seq值 得知删除成功且seq值没有发送变化@H_404_1@

delete from music where ID=(select max(ID) from music)
@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 3



插入一条新记录在看表中的记录和seq值 发现表中自增列中的自增值最大那条记录自增值不是递增的
@H_404_1@

insert into music (name,111)@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
3 4 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 4


@H_404_1@

修改seq值为200 插入一条新纪录 观察表记录和seq值
@H_404_1@

update sqlite_sequence set seq=200 where name='music'@H_404_1@

insert into music (name,111)
@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
3 4 aaaa bbb ccc 111
4 201 aaaa bbb ccc 111@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 201


@H_404_1@

修改seq值为100 插入一条新纪录 观察表记录和seq值@H_404_1@

update sqlite_sequence set seq=100 where name='music'@H_404_1@

insert into music (name,111)
@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
3 4 aaaa bbb ccc 111
4 201 aaaa bbb ccc 111
5 202 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 202


@H_404_1@

插入一条自增值为100的记录@H_404_1@

insert into music (ID,name,ower_ID) values (100,'aaaa',111)@H_404_1@

观察表记录和seq值@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
3 4 aaaa bbb ccc 111
4 100 aaaa bbb ccc 111
5 201 aaaa bbb ccc 111
6 202 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 202

干掉自增值最大的2条记录 在插入一条新记录 待插入记录自增值为101 或修改seq为100@H_404_1@

delete from music where ID=(select max(ID) from music)@H_404_1@

delete from music where ID=(select max(ID) from music)@H_404_1@

执行(
@H_404_1@

update sqlite_sequence set seq=100 where name='music'@H_404_1@

insert into music (name,111)@H_404_1@

) 或insert into music (name,101)@H_404_1@


@H_404_1@ 查看表记录和seq值

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 1 aaaa bbb ccc 111
2 2 aaaa bbb ccc 111
3 4 aaaa bbb ccc 111
4 100 aaaa bbb ccc 111
5 101 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 101


@H_404_1@

清空整个表查看seq值@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@

RecNo name seq
1 music 101@H_404_1@


@H_404_1@

插入新记录查看表记录和seq值@H_404_1@

insert into music (name,111)
@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 102 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 102


@H_404_1@

干掉重建表 查看seq值为空 表示在插入记录时ID为1@H_404_1@

drop table music@H_404_1@

CREATE table music (ID INTEGER PRIMARY KEY autoINCREMENT,ower_ID INTEGER );@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq

插入一条ID为-120的记录查看表记录和seq
@H_404_1@

insert into music (ID,ower_ID) values (-120,111)@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 -120 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq
1 music 0

插入一条新记录查看表记录和seq
@H_404_1@

insert into music (name,111)
@H_404_1@

select * from music@H_404_1@

RecNo ID name author note ower_ID
1 -120 aaaa bbb ccc 111
1 1 aaaa bbb ccc 111
@H_404_1@

select * from sqlite_sequence where name='music'@H_404_1@ RecNo name seq 1 music 1 总结

以上是内存溢出为你收集整理的sqlite 自增列 起始值和值不连续的问题全部内容,希望文章能够帮你解决sqlite 自增列 起始值和值不连续的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1171549.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存