很多表中的我们需要一个自增长字段,这个字段有的时候还是主字段,这些自增长字段往往给我们的记录的插入操作带来某些困难。这里从自定义字段的创建、插入、已经插入时的注意事情和遇到的错误系统的来说一说。
文章目录
一、增加自增长字段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
精彩文章
发表评论