擅长:python、mysql、java
<p><code>INSERT OR IGNORE</code>适用于您不关心记录的标识的情况;在这种情况下,目标只是让<em>一些具有该特定值的</em>记录。</p>
<p>如果要知道是否插入了新记录,必须手动检查:</p>
<pre><code>the_id_of_the_row = None
for row in sql.execute("SELECT id FROM foo WHERE data = ?", ...):
the_id_of_the_row = row[0]
if the_id_of_the_row is None:
c = sql.cursor()
c.execute("INSERT INTO foo(data) VALUES(?)", ...)
the_id_of_the_row = c.lastrowid
</code></pre>
<p>至于效率:当SQLite检查<code>data</code>列中是否有重复项时,它必须执行与对<code>SELECT</code>执行的查询完全相同的查询,并且一旦完成此操作,访问路径就在缓存中,因此性能不应成为问题。在任何情况下,执行两个独立的<code>INSERT</code>/<code>SELECT</code>查询都需要<em>(按任意顺序,您的代码和我的代码都可以工作,但您的代码更简单)。</p>