Sql 如何获取现有表项的ID或插入新表项以防它不';你不能有效地生存吗?
我用它来维护一个数据库,其中包括一个带有路径的表。表的CREATE语句如下所示Sql 如何获取现有表项的ID或插入新表项以防它不';你不能有效地生存吗?,sql,optimization,sqlite,query-optimization,Sql,Optimization,Sqlite,Query Optimization,我用它来维护一个数据库,其中包括一个带有路径的表。表的CREATE语句如下所示 CREATE TABLE path (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, UNIQUE(name)); 我正在寻找一种简短的方式,在SQL中说“将这个给定的路径插入路径表,并给我它分配的id,或者如果它已经存在,就给我id” 现在,我正在使用多个SQL语句(伪代码): 因此,我首
CREATE TABLE path (id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
UNIQUE(name));
我正在寻找一种简短的方式,在SQL中说“将这个给定的路径插入路径表,并给我它分配的id,或者如果它已经存在,就给我id”
现在,我正在使用多个SQL语句(伪代码):
因此,我首先尝试查找id;如果它似乎不存在,我会添加一个新条目,最后进行另一次选择以获取最近使用的id。这看起来有点笨拙,可能效率低下
有没有更紧凑和/或有效的方法来实现此逻辑
更新:常见的情况是条目已经存在,因此上述伪代码中的初始选择将在大多数情况下找到结果。您可以通过两个步骤来完成此操作,使用插入值(如果该值不存在),然后选择元素的id。True!然而,我应该更准确地回答我的问题。通常情况下,该值确实存在。因此,在任何情况下,使用INSERT或IGNORE后跟SELECT将执行两个查询,而问题中的伪代码在大多数情况下只执行一个查询。当然,您在回答时不可能知道这一点,因此+1感谢您提供了比我更短的解决方案。:-)如果该值在大多数情况下已经存在,那么您的代码已经很有效了;然而,有没有可能有一个比我写的更短的同样(或更)有效的解决方案?也许是一些聪明的嵌套SQL查询吧?接受这个答案;我想你是对的-如果通用路径是该值已经存在,那么siml SELECT就尽可能地高效。
unsigned int getIdForPath(p) {
result = exec("SELECT id FROM path WHERE name='$p';");
if result.empty {
exec("INSERT INTO path VALUES(NULL, '$p');");
result = exec("SELECT last_insert_rowid() FROM path;");
}
return result.toInt();
}