Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite向上插入并获取插入或更新的rowid_Sql_Sqlite_Upsert - Fatal编程技术网

SQLite向上插入并获取插入或更新的rowid

SQLite向上插入并获取插入或更新的rowid,sql,sqlite,upsert,Sql,Sqlite,Upsert,我有一个存储目录路径(dir)的表。这些目录行由文件表引用,使用目录的rowid作为外键。重新索引目录/文件时,需要检查它们是否已经存在,并根据需要插入/更新。添加目录路径后,目录中的文件将有额外的插入/更新,因此需要目录的行ID。为了优化,我想尝试插入目录,并在发生冲突时(已在目录表中)更新可能已更改的其他字段。但是,我还需要目录的rowid,无论它们是插入的还是更新的 我首先尝试了REPLACE,但它有一个不幸的副作用,即它更改了rowid,从而破坏了现有文件和目录的外键关系 最初,当我遇到

我有一个存储目录路径(dir)的表。这些目录行由文件表引用,使用目录的rowid作为外键。重新索引目录/文件时,需要检查它们是否已经存在,并根据需要插入/更新。添加目录路径后,目录中的文件将有额外的插入/更新,因此需要目录的行ID。为了优化,我想尝试插入目录,并在发生冲突时(已在目录表中)更新可能已更改的其他字段。但是,我还需要目录的rowid,无论它们是插入的还是更新的

我首先尝试了REPLACE,但它有一个不幸的副作用,即它更改了rowid,从而破坏了现有文件和目录的外键关系

最初,当我遇到UPSERT操作的概念时,我很兴奋,因为我认为它可以做我想做的事情。但是,经过大量研究,我得出结论,当前的SQLite3无法在更新发生时使用“INSERT..ON CONFLICT UPDATE..”获取受影响的rowid,而不使用额外的SELECT语句按目录名检索ID。因此,当需要插入/更新的rowid来进行其他插入时,使此功能变得有些无用。它可以执行的一项改进是,通过使用C API函数sqlite3_set_last_INSERT_rowid()将last INSERT rowid设置为0来检测是否发生了插入或更新,这将避免在发生插入时进行选择,因为可以调用C API sqlite3_last_INSERT_rowid(),如果它不是0,然后是插入的rowid

这是一个遗憾,因为SQLite显然知道UPSERT操作中刚更新的行的rowid,但无法使其可用。也许这是对未来版本的一个很好的特性要求。可以将其存储到最后一个\u insert\u rowid,因为在插入的情况下,它无论如何都会被设置

如果其他人有更好的方法来实现这一点,我很乐意听到他们的消息