加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Sqlite插入带有唯一名称,获取id

发布时间:2020-12-12 18:59:34 所属栏目:百科 来源:网络整理
导读:我有一个要插入数据库的字符串列表.它们必须是独一无二的.当我插入我想要他们的ID(用作另一个表中的外键)所以我使用last_insert_rowid.我遇到了2个问题. 如果我使用替换,他们的身份 (INTEGER PRIMARY KEY)更新哪些 打破我的数据库(条目指向 不存在的ID) 如果
我有一个要插入数据库的字符串列表.它们必须是独一无二的.当我插入我想要他们的ID(用作另一个表中的外键)所以我使用last_insert_rowid.我遇到了2个问题.

>如果我使用替换,他们的身份
(INTEGER PRIMARY KEY)更新哪些
打破我的数据库(条目指向
不存在的ID)
>如果我使用ignore,则不会更新rowid,因此我没有获得正确的ID

我怎么得到他们的ID?如果我不需要我不想使用select语句检查并插入字符串,如果它不存在.我该怎么办?

解决方法

发生UNIQUE约束冲突时,REPLACE算法会在插入或更新当前行之前删除导致约束违规的预先存在的行,并且命令将继续正常执行.这会导致rowid更改并产生以下问题

Y:> **sqlite3 test**  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> **create table b (c1 integer primary key,c2 text UNIQUE);**  
sqlite> **insert or replace into b values (null,'test-1');**  
sqlite> **select last_insert_rowid();**  
1  
sqlite> **insert or replace into b values (null,'test-2');**  
sqlite> **select last_insert_rowid();**  
2  
sqlite> **insert or replace into b values (null,'test-1');**  
sqlite> **select last_insert_rowid();**  
3  
sqlite> **select * from b;**  
2|test-2  
3|test-1

解决方法是更改??c2列的定义,如下所示

create table b (c1 integer primary key,c2 text UNIQUE ON CONFLICT IGNORE);

并从插入中删除“或替换”条款;

然后在插入测试后,你需要执行以下sql:select last_insert_rowid(),changes();

sqlite> **create table b (c1 integer primary key,c2 text UNIQUE ON CONFLICT IGNORE);**  
sqlite> **insert into b values (null,'test-1');**  
sqlite> **select last_insert_rowid(),changes();**  
1|1  
sqlite> **insert into b values (null,'test-2');**  
sqlite> **select last_insert_rowid(),changes();**  
2|1  
sqlite> **insert into b values (null,changes();**  
2|0

第3次插入后更改的返回值将是通知您的应用程序,您需要查找“test-1”的rowid,因为它已经存档.当然,如果这是一个多用户系统,您还需要将所有这些包装在一个事务中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读