很多表中的我们需要一个自增长字段,这个字段有的时候还是主字段,这些自增长字段往往给我们的记录的插入操作带来某些困难。这里从自定义字段的创建、插入、已经插入时的注意事情和遇到的错误系统的来说一说。

文章目录

一、增加自增长字段1、利用工具来设置自增长字段2、利用代码添加自增长字段

二、插入时遇到的错误1、Parameter count mismatch2、Unable to fetch row

三、解决错误1、使用数据库的公共row计数器2、禁止其他表使用共用row计数器3、注意事项

文章出处:

https://blog.csdn.net/haigear/article/details/127479797

一、增加自增长字段

1、利用工具来设置自增长字段

这里我们以比较常用的SqliteStudio为例来说明设置它的操作,需要注意的是数据类型必须设置为Integer类型,否则不能设置为自增长(AutoIncrement)类型。 只有设置为主键Primary Key才能在其配置(configure)中设置自增长。这个时候ID的自增长值就是一个64位有符号整数,默认起始值为1。

2、利用代码添加自增长字段

如果我们用代码来实现,则必须写明 PRIMARY KEY AUTOINCREMENT 比如,我们有这么一个代码:

CREATE TABLE tbRecipeIndex (

cName CHAR (8),

cCode CHAR (5),

id INTEGER PRIMARY KEY AUTOINCREMENT

);

二、插入时遇到的错误

1、Parameter count mismatch

可能有人想,既然这个字段都是自增长,那么是否可以不管它,只给其余的字段插入值即可呢?如果你这么做,"Parameter count mismatch"的错误就报出来了。

2、Unable to fetch row

遇到这种错误,很显然是因为你的表中有一个自增长字段。我们可能在网上查到,只要我们给这个自增长字段的插入值设置为null即可,如这般:

QSqlQuery sql

QString sqlStr=QString("insert into tbRecipeIndex values(?,?,?)");

sql.prepare(sqlStr);

sql.bindValue(0,cName);

sql.bindValue(1,cCode);

sql.bindValue(3,NULL);

sql.exec();

这样做的结果是,第一次执行可能会成功,第二次就会遇到Unable to fetch row的报错,因为默认为null的结果就是系统会给你的ID插入一个为0的值,第二次再执行的时候,值为0的记录有了,所以不可以再次重写该条记录了,这就是本质原因。如果我们删除这个字段,你的插入会变得很正常。

三、解决错误

1、使用数据库的公共row计数器

我们遇到这样的情况不能真的删除我们的主键字段吧,这个肯定不是我们愿意做的。我们可以将value的第三个占位符替换为last_insert_rowid(),这样就可以了,但有个缺点,那就是每次得到的ID的编码显得不那么规则,因为这个ID的自增器是整个数据库共用的(为什不需要sql语句查询就可以直接last_insert_rowid()用它来获得rowid也就是这个原因),而不是某一个表的rowid。

QSqlQuery sql

QString sqlStr=QString("insert into tbRecipeIndex values(?,?,last_insert_rowid())");

sql.prepare(sqlStr);

sql.bindValue(0,cName);

sql.bindValue(1,cCode);

// sql.bindValue(3,NULL);

sql.exec();

2、禁止其他表使用共用row计数器

为了解决ID规则的问题,你可以让其他的无须要使用自增长ID的表设置为WITHOUT ROWID ,在创建表时使用WITHOUT ROWID以声明不生成rowid字段,,那么这个表在插入新记录的时候就不会使rowid的计数器计数。例如:

CREATE TABLE IF NOT EXISTS wordcount(

word TEXT PRIMARY KEY,

cnt INTEGER

) WITHOUT ROWID;

3、注意事项

关于获取最后一条记录的rowID,我们可以参考sqlite的API,SQLiteAPI 函数sqlite3_last_insert_rowid()条目。不同进程调用last_insert_rowid()返回的结果不一样。以为他返回的结果只对同一进程有效。

其实,还有个办法就是通过查询语句直接获得当前操作表的id字段的最后一个记录的值,然后加1作为后一条记录的id值即可。就是多一次查询而已。

码字不易,转载注明出处:https://blog.csdn.net/haigear/article/details/127479797

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: