
Sqlite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,引擎会设定为最大的rowid+1。当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。当这个rowid的值大于所能表达的最大值 9223372036854775807 (3.0及以后版本的rowid最大值)后,rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。
INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。
第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。
第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。
比如,我们设计一个元记录表:
drop table test
create table test (
[tkid]integer PRIMARY KEY autoincrement,-- 设置主键
[tktype] int default 0,
[tableid] varchar (50),
[createdate] datetime default (datetime('now', 'localtime'))-- 时间
)
第三,使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,用户可以看到,并可以用使用 Update、Delete和Insert *** 作,但不建议这么使用,这会让引擎混乱。如果使用rowid,也会有这么一个内部表,用户可以维护rowid 值,但看不到。
这么看来,如果直接使用rowid来代替自增加字段,根据两者的细微的差别,需要注意是否与自己的应用冲突,如果没有冲突,那么用rowid会更快一点。
SQLite中创建自增字段:
简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加。
从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 INTEGER PRIMARY KEY,那么无论你何时向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数;如果表为空,那么将被更换为 1。
一个新的API函数 sqlite3_last_insert_rowid() 返回最近的插入 *** 作的整形键.
注意这个整型键始终比之前插入表中的最后一个键大1。新键相对于表中的已有键来说是唯一的,但它可能与之前从表中删除的键值重叠。要始终得到在整个表中唯一的键,在INTEGER PRIMARY KEY的声明之前加关键词AUTOINCREMENT.这样被选的键将总是比表中已存在的最大键大1。若可能的最大键已存在于表中,INSERT *** 作将失败并返回一个SQLITE_FULL错误码.
id int identity(1,1) 是 SQL Server 的 自动递增列的写法。对于SQLite
主键数据类型为 int 类型。
插入的时候,不传入数据, 就是默认为自动递增处理。
last_insert_rowid() 函数用于获取最新生成的 ID
sqlite>CREATE TABLE test_create_tab2 (
...> id integer,
...> val VARCHAR(10),
...> PRIMARY KEY (id)
...>)
sqlite> INSERT INTO test_create_tab2(val) VALUES ('NO id')
sqlite>select last_insert_rowid()
last_insert_rowid()
1
sqlite>INSERT INTO test_create_tab2(val) VALUES ('NO id 2')
sqlite>select last_insert_rowid()
last_insert_rowid()
2
sqlite>select * from test_create_tab2
id|val
1|NO id
2|NO id 2
sqlite>INSERT INTO test_create_tab2(id, val) VALUES (100, 'id is 100')
sqlite>INSERT INTO test_create_tab2(val) VALUES ('NO id again')
sqlite>select * from test_create_tab2
id|val
1|NO id
2|NO id 2
100|id is 100
101|NO id again
注意:
对于无主键的表
SQLite 中还有一个 伪列 rowid, 可以作为自动递增的查询处理。
sqlite>CREATE TABLE test_create_tab3 (
...> id integer,
...> val VARCHAR(10)
...>)
sqlite>
sqlite>INSERT INTO test_create_tab3(id, val) VALUES (1, 'Test1')
sqlite>INSERT INTO test_create_tab3(id, val) VALUES (2, 'Test2')
sqlite>INSERT INTO test_create_tab3(id, val) VALUES (100, 'Test100')
sqlite>INSERT INTO test_create_tab3(id, val) VALUES (101, 'Test101')
sqlite>select rowid, id, val from test_create_tab3
rowid|id|val
1|1|Test1
2|2|Test2
3|100|Test100
4|101|Test101
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)