INTEGER PRIMARY KEY简介

IT教程 1年前 (2020) https://www.renrenfan.com.cn
581

primarykey

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

Sqlite中INTEGERPRIMARYKEYAUTOINCREMENT和rowid/INTEGERPRIMARYKEY的使用

在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,插入后能直接得到该主键.

因为sqlite内部本来就会为每个表加上一个rowid,这个rowid可以当成一个隐含的字段使用,

但是由sqlite引擎来维护的,在3.0以前rowid是32位的整数,3.0以后是64位的整数,可以使用这个内部的rowid作为每个表的id主键。

查了下文档:

参照http://www.sqlite.org/c3ref/last_insert_rowid.html。

EachentryinanSQLitetablehasaunique64-bitsignedintegerkeycalledthe"rowid".

TherowidisalwaysavailableasanundeclaredcolumnnamedROWID,OID,

or_ROWID_aslongasthosenamesarenotalsousedbyexplicitlydeclaredcolumns.

IfthetablehasacolumnoftypeINTEGERPRIMARYKEYthenthatcolumnisanotheraliasfortherowid.

如果表中有个INTEGERPRIMARYKEY字段,那么它只是rowid的别名。

ThisroutinereturnstherowidofthemostrecentsuccessfulINSERTintothedatabasefromthedatabaseconnectioninthefirstargument.

IfnosuccessfulINSERTshaveeveroccurredonthatdatabaseconnection,zeroisreturned.

如果成功插入一条数据,会返回刚刚插入的数据的rowid.如果失败返回0.Android中如果发生错误返回的是-1

参照http://www.sqlite.org/faq.html

Shortanswer:AcolumndeclaredINTEGERPRIMARYKEYwillautoincrement.

Hereisthelonganswer:IfyoudeclareacolumnofatabletobeINTEGERPRIMARYKEY,

thenwheneveryouinsertaNULLintothatcolumnofthetable,

theNULLisautomaticallyconvertedintoanintegerwhichisonegreaterthanthelargestvalueofthatcolumnover

allotherrowsinthetable,or1ifthetableisempty.(Ifthelargestpossibleintegerkey,9223372036854775807,

thenanunusedkeyvalueischosenatrandom.)Forexample,supposeyouhaveatablelikethis:

CREATETABLEt1(

aINTEGERPRIMARYKEY,

bINTEGER

);

Withthistable,thestatement

INSERTINTOt1VALUES(NULL,123);

islogicallyequivalenttosaying:

INSERTINTOt1VALUES((SELECTmax(a)FROMt1)+1,123);

Thereisafunctionnamedsqlite3_last_insert_rowid()whichwillreturntheintegerkeyforthemostrecentinsertoperation.

Notethattheintegerkeyisonegreaterthanthelargestkeythatwasinthetablejustpriortotheinsert.

Thenewkeywillbeuniqueoverallkeyscurrentlyinthetable,

butitmightoverlapwithkeysthathavebeenpreviouslydeletedfromthetable.

Tocreatekeysthatareuniqueoverthelifetimeofthetable,

addtheAUTOINCREMENTkeywordtotheINTEGERPRIMARYKEYdeclaration.

Thenthekeychosenwillbeonemorethanthanthelargestkeythathaseverexistedinthattable.

Ifthelargestpossiblekeyhaspreviouslyexistedinthattable,thentheINSERTwillfailwithanSQLITE_FULLerrorcode.

把一个列申明为INTEGERPRIMARYKEY,那么在向它插入NULL,该列就由系统指定。该值为已经存在的数据的该列的最大值加1。空表时该值就为1

如果该值已经超过了最大值,那么它会随即选择一个已存数据没使用过的值做个插入数据的值。

如果用户在插入时给它指定一个值,那么返回的也是那个值。

因为本来返回的应该是rowid,但如果表中有个INTEGERPRIMARYKEY字段,那么它只是rowid的别名。

所以返回的就是指定的那个值。

把一个列声明为INTEGERPRIMARYKEYAUTOINCREMENT的话,它的值是选择的在该表中曾经使用过的最大值+1。

如果达到了最大值的话,会插入失败,并抛出anSQLITE_FULLerrorcode。

再参照sqlite的文档:

http://www.sqlite.org/autoinc.html

最后得出以下结论:

用自增长字段为主键有不少问题,比如维护或是在大型分布应用中主键冲突的解决等。在一些大型分布应用中主键一般选用guid,这可以有效的避免主键冲突,减少对主键维护的工程

当然,对于中小型的应用,自增长字段的好处更多一些,简单、快速。

Sqlite中,一个自增长字段定义为INTEGERPRIMARYKEYAUTOINCREMENT或者INTEGERPRIMARYKEY时,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值。

当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。

对于INTEGERPRIMARYKEY,当这个rowid的值大于所能表达的最大值9223372036854775807(3.0及以后版本的rowid最大值)后,rowid的新值会这个最大数之前随机找一个没被使用了的值。

所以在rowid达到最大值前,rowid的值是严格单调增加的。

INTEGERPRIMARYKEYAUTOINCREMENT自增长字段的算法与rowid/INTEGERPRIMARYKEY稍微有些不同。

第一,在达到最大值后,rowid/INTEGERPRIMARYKEY会找已被删除的字段对应的rowid/INTEGERPRIMARYKEY作为新值,

而自增长字段INTEGERPRIMARYKEYAUTOINCREMENT则会丢出一个SQLITE_FULL的错误。

第二,自增长字段INTEGERPRIMARYKEYAUTOINCREMENT在增加新值时,是找一个从没被使用过的值作为新值,而rowid/INTEGERPRIMARYKEY则是找最大已存在的(rowid/INTEGERPRIMARYKEY)+1。

这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid/INTEGERPRIMARYKEY。

比如,我们设计一个元记录表:

Createtablemeta_struct(idINTEGERPRIMARYKEYAUTOINCREMENT,namevarchar,typeInteger);

然后,定义一个一级表,来描述其它表的结构:

Createtablemeta_table(tableidINTEGER,table_fieldinteger)

最后,我们的应用可以根据这个一级表来产生实际使用的二级表。

这样为保证兼容性meta_struct中的id必须是唯一的,如果有字段被删除,也不能重复使用这个字段的id值,不然,在数据库合并时,一级表和二级表就会混乱。

所以meta_struct表中的主键只能使用自增长字段,而不能用rowid。

第三,使用自增长字段INTEGERPRIMARYKEYAUTOINCREMENT,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,

用户可以看到,并可以用使用Update、Delete和Insert操作,但不建议这么使用,这会让引擎混乱。

如果使用rowid/INTEGERPRIMARYKEY,也会有这么一个内部表,用户可以维护rowid/INTEGERPRIMARYKEY值,但看不到。

这么看来,如果直接使用rowid/INTEGERPRIMARYKEY来代替自增加字段,根据两者的细微的差别,需要注意是否与自己的应用冲突,

如果没有冲突,那么用rowid/INTEGERPRIMARYKEY会更快一

第四,在android中,对于INTEGERPRIMARYKEY,

如果插入数据A,B,C,它们的_id为1,2,3,那么如果把他们都删除了,再插入一条数据,那么它的id为1而不是4。

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

INTEGER PRIMARY KEY简介

OneKey一键还原怎么使用?

OneKey一键还原又称onekey ghost,这是由雨林木风团队全力打造的一款系统备份还原工具,具有支持win系统下任意分区的备份和还原,支持

monkeyrunner使用

monkey和monkeyrunner都是android sdk提供的测试命令,但monkeyrunner和money没有什么直接的关系,monkey是在设备直接运行adb shell

[ElasticSearch]数据类型keyword和text的区别

在 ES2.x 版本字符串数据是没有 keyword 和 text 类型的,只有string类型,ES更新到5版本后,取消了 string 数据类型,代替它的是 keywo

keynote讲演内容怎么添加上下标?

keynote文本框上,要对讲演上的数字上标下标,怎么对数字进行上标或下标呢?下面我们就来看看详细的教程。1、点击显示,点击自定义工具栏

2018申请淘宝客AppKey

1.www.alimama.com 申请账号进入后2.进入我的联盟,按下面的步骤完成以后等待网站审核。3.审核完成后按以下的图,申请进入开放平

文章回顾

大家看了本文INTEGER PRIMARY KEY简介的精彩教程资源内容,是不是对INTEGER PRIMARY KEY简介了解更多,真心希望INTEGER PRIMARY KEY简介能帮助到你, 小编会一直给你带来更多教程资源文章信息。

版权声明:5ac5428456143da1 发表于 2020-01-22 21:15:07。

本文由第三方用户分享仅代表作者观点,不代表本网站立场,秉承互联网开放分享的精神,目的在于传递更多信息,加强各行业互通交流,但对内容不作任何保证或承诺,请读者自行参考斟酌。网站发布的信息(包含但不限于版式、图片、字体、文章等素材)由第三方用户分享,版权归原作者所有,本站不承担任何相关的版权纠纷等相关责任。如您认为本篇内容侵犯了您的权益,请与我们联系,我们会及时处理。

人人翻致力于国内用户最爱翻的资源网站大全

转载请注明:
本文标题:INTEGER PRIMARY KEY简介
本文地址:https://www.renrenfan.com.cn/s4225.html