-
2021-02-22 11:55:03
SQLite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,引擎会设定为最大的rowid+1。如果表為空,那麼將會插入1。
比如,有一張表ID為自增:
CREATE TABLE Product
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name VARCHAR(100) NOT NULL
)
那麼,插入的SQL就是:
INSERT INTO Product VALUES(NULL, '產品名稱')GO
SQLite中不支持关键字top
select top 1 oid from orderinfo order by oid desc ; (×)
select oid from orderinfo order by oid desc limit 0,1;(√)更多相关内容 -
SQLite3中自增主键相关知识总结
2021-01-17 13:10:13一、SQLite清空表并将自增列归零SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。但SQLite不支持这个语句。在SQLite中直接使用 DELETE FROM TableName 就可以了。对于大多数DBMS来说,用DELETE不如用TRUNCATE...一、SQLite清空表并将自增列归零
SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。
但SQLite不支持这个语句。在SQLite中直接使用 DELETE FROM TableName 就可以了。
对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动。
SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:
通常在清空表的时候,还需要把自增列归零。在SQLite中定义自增列的方法如下:
复制代码 代码如下:
CREATE TABLE TableName ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer );
当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。
这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。
如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
复制代码 代码如下:
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';
也可以直接把该记录删掉:
复制代码 代码如下:
DELETE FROM sqlite_sequence WHERE name='TableName';
要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了:
复制代码 代码如下:
DELETE FROM sqlite_sequence;
二、Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
在用sqlite设计表时,突然想到一个问题,就是我设计的表中,每个表都有一个自己的整形id值作为主键,
其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,
为什么不直接使用这个内部的rowid作为每个表的id主键呢。
使用自增长字段为主键有不少问题,比如维护或是在大型分布应用中主键冲突的解决等。
在一些大型分布应用中主键一般选用guid,这可以有效的避免主键冲突,减少对主键维护的工程。
当然,对于中小型的应用,自增长字段的好处更多一些,简单、快速。
Sqlite中,一个自增长字段定义为 INTEGER PRIMARY KEY AUTOINCREMENT
那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,
引擎会设定为最大的rowid+1 当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。
rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。
INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。
第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。
第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。
这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。
比如,我们设计一个元记录表:
复制代码 代码如下:
Create table meta_struct(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer);
然后,定义一个一级表,来描述其它表的结构:
复制代码 代码如下:
Create table meta_table(tableid INTEGER, table_field integer)
最后,我们的应用可以根据这个一级表来产生实际使用的二级表。
这样为保证兼容性meta_struct中的id必须是唯一的,如果有字段被删除,也不能重复使用这个字段的id值,不然,在数据库合并时,
一级表和二级表就会混乱。所以meta_struct表中的主键只能使用自增长字段,而不能用rowid。
第三,使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,用户可以看到,
并可以用使用Update、Delete和Insert操作,但不建议这么使用,这会让引擎混乱。如果使用rowid,也会有这么一个内部表,用户可以维护rowid值,但看不到。
-
SQLite3中自增主键
2021-05-19 20:50:30SQLite清空表并将自增列归零 SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。 但SQLite不支持这个语句。在SQLite中直接使用 DELETE FROM TableName 就可以了。 对于大多数DBMS来说,用DELETE不如用TRUNCATE ...SQLite清空表并将自增列归零
SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。
但SQLite不支持这个语句。在SQLite中直接使用 DELETE FROM TableName 就可以了。
对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动。SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:
通常在清空表的时候,还需要把自增列归零。在SQLite中定义自增列的方法如下:
CREATE TABLE TableName ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer );当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。
这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。
如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';也可以直接把该记录删掉:
DELETE FROM sqlite_sequence WHERE name='TableName';
要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了:
DELETE FROM sqlite_sequence;Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
在用sqlite设计表时,突然想到一个问题,就是我设计的表中,每个表都有一个自己的整形id值作为主键,
其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,为什么不直接使用这个内部的rowid作为每个表的id主键呢。
使用自增长字段为主键有不少问题,比如维护或是在大型分布应用中主键冲突的解决等。
在一些大型分布应用中主键一般选用guid,这可以有效的避免主键冲突,减少对主键维护的工程。
当然,对于中小型的应用,自增长字段的好处更多一些,简单、快速。Sqlite中,一个自增长字段定义为 INTEGER PRIMARY KEY AUTOINCREMENT
那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,
引擎会设定为最大的rowid+1 当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。
INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。
第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。
第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。
比如,我们设计一个元记录表:
Create table meta_struct(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer);
然后,定义一个一级表,来描述其它表的结构:
Create table meta_table(tableid INTEGER, table_field integer)最后,我们的应用可以根据这个一级表来产生实际使用的二级表。
这样为保证兼容性meta_struct中的id必须是唯一的,如果有字段被删除,也不能重复使用这个字段的id值,不然,在数据库合并时,
一级表和二级表就会混乱。所以meta_struct表中的主键只能使用自增长字段,而不能用rowid。第三,使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,用户可以看到,
并可以用使用Update、Delete和Insert操作,但不建议这么使用,这会让引擎混乱。如果使用rowid,也会有这么一个内部表,用户可以维护rowid值,但看不到。 -
sqlite的自增主键与自增主键归零
2014-10-29 16:05:27引用:... ... 1.sqlite的自增主键: 用数据库缓存一些数据,想实现队列的那种,先入先出,需要对插入sqlite的数据进行个排序,实验了rowid,好像sqlite不能按照rowid删除,故考虑增加
1.sqlite的自增主键:用数据库缓存一些数据,想实现队列的那种,先入先出,需要对插入sqlite的数据进行个排序,实验了rowid,好像sqlite不能按照rowid删除,故考虑增加一个自增主键的字段,来区分插入的先后!sqlite从2.3.4版本开始支持自增主键, 如果将一个表中的一个字段声明为 INTEGER PRIMARY KEY,那么只需向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数;如果表为空,那么将被更换为 1。CREATE TABLE "ProcessList"(
[Id] integer(4) PRIMARY KEY
,[Type] varchar(20)
,[Name] varchar(30)
,[IsUse] int
)
执行
insert into processlist
values
(null,'a','b',1)要始终得到在整个表中唯一的键,在INTEGER PRIMARY KEY的声明之前加关键词AUTOINCREMENT.这样被选的键将总是比表中已存在的最大键大1。若可能的最大键已存在于表中,INSERT操作将失败并返回一个SQLITE_FULL错误码。故建议sql为:CREATE TABLE "ProcessList"(
[Id] integer(4) AUTOINCREMENT PRIMARY KEY,[Type] varchar(20)
,[Name] varchar(30)
,[IsUse] int
)2.自增主键归零自增主键是通过表sqlite_sequence来实现的。使用自增长字段,引擎会自动产生一个sqlite_sequence表,在sqlite_sequence中有两个字段name、seq。name记录了表名,seq记录了该表的最大id,每插入一条记录,相应的seq加1,删除记录时,此记录不会变化。故若想自增主键归零需手动修改sqlite_sequence中相应的记录。 -
sqlite 自增列 起始值和值不连续的问题
2014-10-24 18:04:28一个表中只能拥有一个自增列 如果多个列需要自增 其它的列只能通过触发器来完成列值的自增 ...seq值: sqlite数据库用来保存表中自增列中存储的最大自增值 新插入的记录自增值默认为该值+1 存储在sqlite -
Qt SQlite获取自增ID的当前值
2021-04-07 16:43:03QSqlDatabase db = QSqlDatabase::database("sqlite1"); //建立数据库连接sqlite1 QSqlQuery query(db); query.exec("SELECT last_insert_rowid()"); query.next();...//ID 就是最后一次插入数据自增的id -
MySQL获取自增主键ID的四种方法
2021-03-04 05:36:031. SELECT MAX(id) FROM tablename 2. LAST_INSERT_ID() 函数 LAST_... 得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID。 上述内容来自互联网 相关内容: -
获取数据库自增id最大值
2020-08-26 09:24:34Long nowmaxId = jdbcTemplate.queryForObject(String.format("SELECT MAX(user_id) FROM sys_user"), Long.class); -
SQLITE数据表主键设置Id自增方法
2019-07-24 14:52:34网上查到资料说,从 SQLite 的 2.3.4 版本开始,如果将一个表中的一个字段声明为 INTEGER PRIMARY KEY,那么只需向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数... -
SQLite清空表并将自增列归零
2022-04-18 14:20:39一、SQLite清空表并将自增列归零 在SQLite中直接使用 DELETE FROM TableName 就可以了。 通常在清空表的时候,还需要把自增列归零。 在SQLite中定义自增列的方法如下:代码如下: CREATE TABLE TableName ( id ... -
SQLite 递增主键 (Autoincrement)
2019-09-18 07:03:54概述1 自增主键(TheAUTOINCREMENT keyword)占用额外CPU,内存,磁盘空间,并且增加磁盘I/O的开销(disk I/O overhead),所以如无必要,应该禁用。通常情况下是不需要的。2 SQLite中,指定其中的一列的属性为INTEGER... -
【Qt】使用sqlite3数据库时,主键自增和获取自增后的主键的
2018-09-28 18:46:09创建数据表格,设置主键自增 创建数据库时,启用主键自增加特性 Create table testTable (id INTEGER PRIMARY KEY AUTOINCREMENT,。...插入数据后,获取自增的主键值 QSqlQuery::exec(“SELECT last_i... -
sqlite创建自增字段浅谈(AUTOINCREMENT)
2019-07-29 23:09:08注释:这些天一直在写sqlite的脚本,今天就归纳一下 sqlite自增字段的知识,希望可以帮助到大家。此笔记可能会有一些错误和疏漏,望指正,谢谢~~~ 目录 文章目录一、sqlite自增字段小结二、MySQL的windows服务的... -
SQLITE 自增列
2014-02-26 14:56:42在SQLite中,每个Table隐含包含64bit的自增字段,该字段有SQLite维护,可以通过列名ROWID, _ROWID_, 或者OID可以访问,当该Table中存在整形主键时,该自增字段由该主键替换,该主键也是该自增字段的别名。... -
两种方式实现SQLite 主键自动增加
2012-12-11 15:43:39SQLite 主键自动增加(autoincrease)可以实现,经过测试,有以下两种方法: 下面所有的代码和结果,都是真实实验的结果。 1、使用类似 MySQL 的 autoincrease 参数,例如: Create table meta_struct(id ... -
MySQL导入csv文件内容到Table及数据库的自增主键设置
2021-05-15 04:40:56写在前面目的是测试将csv文件内容导入到表中, 同时记录一下自增主键的设置.测试采用MySQL8.0.新建表customer_info如下, 未设置主键.修改上表, 添加主键id, 并设置为自增.ALTER TABLE customer_info ADD COLUMN id ... -
flutter菜鸟教程!mysql自增主键实现原理
2021-05-19 14:36:01读请求并发量过高 这里还必须做好压力测试,确保恰巧碰上上述情况的时候,还有一个风险,就是突然间大量读请求会在几十毫秒的延时 hang 在服务上,看服务能不能扛的住,需要多少机器才能扛住最大的极限情况的峰值。... -
android sqlite 主键自增从1开始的问题
2012-05-09 16:30:14我们用mysql的时候,设置主键自增,那么我们插入一条数据,主键会从1开始的,这个sqlite数据要注意了,或许,他开始的不是1,而是一个很大的数。原因待查,下面是我遇到的情况。 网上有人说: 网上查到... -
清空SQLite表后,如何使表的自增ID值也归零。
2019-05-25 17:14:05例如:对于表A,若给表设置ID(主键)为自增,那么如果之前在表中插入10条记录,那么在清空表A后,再次插入记录是ID的值并不是从零开始,而是继续从11开始。 产生原因:sqlite_sequence表(自动创建) sqlite_sequence... -
sqlite3自增key设定(创建自增字段)
2018-10-29 11:40:40在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0... -
SQLite 递增主键(Autoincrement)
2017-11-07 20:19:001自增主键(TheAUTOINCREMENT keyword)占用额外CPU,内存,磁盘空间,并且增加磁盘I/O的开销(disk I/O overhead),所以如无必要,应该禁用。通常情况下是不需要的。 2 SQLITE中,指定其中的一列的属性为INTEGERPR..... -
SQLite主键自动增长
2019-05-23 15:36:37SQLite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将该子弹的值指定为NULL,即可由引擎自动设定其值,引擎会设定为最大的rowid+1,。如果表为空,,那么将会插入1。... -
SQLite学习手册 - 自增与主键
2014-03-15 14:51:41在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0...