精华内容
下载资源
问答
  • 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;(√)

    更多相关内容
  • 一、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:30
    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值,但看不到。

    展开全文
  • 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中相应的记录。
    展开全文
  • 一个表中只能拥有一个自增列 如果多个列需要自增 其它的列只能通过触发器来完成列自增 ...seqsqlite数据库用来保存表中自增列中存储的最大自增值 新插入的记录自增值默认为该+1 存储在sqlite
  • QSqlDatabase db = QSqlDatabase::database("sqlite1"); //建立数据库连接sqlite1 QSqlQuery query(db); query.exec("SELECT last_insert_rowid()"); query.next();...//ID 就是最后一次插入数据自增的id
  • 1. SELECT MAX(id) FROM tablename 2. LAST_INSERT_ID() 函数 LAST_... 得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID。 上述内容来自互联网 相关内容:
  • Long 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清空表并将自增列归零 在SQLite中直接使用 DELETE FROM TableName 就可以了。 通常在清空表的时候,还需要把自增列归零。 在SQLite中定义自增列的方法如下:代码如下: CREATE TABLE TableName ( id ...
  • 概述1 自增主键(TheAUTOINCREMENT keyword)占用额外CPU,内存,磁盘空间,并且增加磁盘I/O的开销(disk I/O overhead),所以如无必要,应该禁用。通常情况下是不需要的。2 SQLite中,指定其中的一列的属性为INTEGER...
  • 创建数据表格,设置主键自增 创建数据库时,启用主键自增加特性 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:39
    SQLite 主键自动增加(autoincrease)可以实现,经过测试,有以下两种方法: 下面所有的代码和结果,都是真实实验的结果。 1、使用类似 MySQL 的 autoincrease 参数,例如: Create table meta_struct(id ...
  • 写在前面目的是测试将csv文件内容导入到表中, 同时记录一下自增主键的设置.测试采用MySQL8.0.新建表customer_info如下, 未设置主键.修改上表, 添加主键id, 并设置为自增.ALTER TABLE customer_info ADD COLUMN id ...
  • 读请求并发量过高 这里还必须做好压力测试,确保恰巧碰上上述情况的时候,还有一个风险,就是突然间大量读请求会在几十毫秒的延时 hang 在服务上,看服务能不能扛的住,需要多少机器才能扛住最大的极限情况的峰值。...
  • 我们用mysql的时候,设置主键自增,那么我们插入一条数据,主键会从1开始的,这个sqlite数据要注意了,或许,他开始的不是1,而是一个很大的数。原因待查,下面是我遇到的情况。    网上有人说:   网上查到...
  • 例如:对于表A,若给表设置ID(主键)为自增,那么如果之前在表中插入10条记录,那么在清空表A后,再次插入记录是ID的并不是从零开始,而是继续从11开始。 产生原因:sqlite_sequence表(自动创建) sqlite_sequence...
  • 在用sqlite设计表时,每个表都有一个自己的整形id作为主键,其实可以不指定这么一个idsqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0...
  • 1自增主键(TheAUTOINCREMENT keyword)占用额外CPU,内存,磁盘空间,并且增加磁盘I/O的开销(disk I/O overhead),所以如无必要,应该禁用。通常情况下是不需要的。 2 SQLITE中,指定其中的一列的属性为INTEGERPR.....
  • SQLite主键自动增长

    千次阅读 2019-05-23 15:36:37
    SQLite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将该子弹的指定为NULL,即可由引擎自动设定其,引擎会设定为最大的rowid+1,。如果表为空,,那么将会插入1。...
  • 在用sqlite设计表时,每个表都有一个自己的整形id作为主键,其实可以不指定这么一个idsqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,020
精华内容 808
关键字:

sqlite自增主键最大值