Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Sql 如何获取现有表项的ID或插入新表项以防它不';你不能有效地生存吗?_Sql_Optimization_Sqlite_Query Optimization - Fatal编程技术网

Sql 如何获取现有表项的ID或插入新表项以防它不';你不能有效地生存吗?

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语句如下所示

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();
}