【问题标题】:How to insert into table only if entry does not already exist? [duplicate]仅当条目不存在时如何插入表? [复制]
【发布时间】:2017-09-19 18:06:38
【问题描述】:

下面是应该将作者姓名添加到表中的部分代码。

def create_author_table():
    cursor.execute("CREATE TABLE IF NOT EXISTS author(name VARCHAR(100),PRIMARY KEY (name))")

if authorFound == 1:
    cursor.execute("INSERT author (name) VALUES (?)", (aname, ))
    conn.commit()

我的其余代码与我认为的问题无关,所以我没有包含它。

我有一个很长的作者姓名列表,每次读入姓名时,我都会尝试将其写入作者表。但是,有些名称是重复的,这是一个问题,因为名称是主键,所以我不能插入重复项。有谁知道只插入表中不存在的名称的查询?我正在通过 jupyter notebook 使用 python 2.7 和 sqlite,以防有人需要知道。

我意识到这个网站上已经有很多类似的问题,但我已经浏览了它们,但我没有任何运气。这是我第一次在 python 中工作,所以我通常没有经验。

【问题讨论】:

  • 我强烈建议不要将 name 作为主键。唯一索引是的,但主键,不。顺便说一句,欢迎来到 Stackoverflow,写了一个格式良好的第一个问题。

标签: database python-2.7 sqlite jupyter-notebook


【解决方案1】:

SQLite 中最简单的方法是定义唯一索引:

create unique index unq_author_name on author(name);

如果name 已经存在,则插入失败。这是最好的方法,因为数据库会验证关系完整性。

另一种方法是在插入时检查值:

INSERT author (name)
    SELECT x.name
    FROM (SELECT ? as name) x
    WHERE NOT EXISTS (SELECT 1 FROM author a WHERE a.name = x.name);

我担心在某些竞争条件下,可能会多次输入同一个名称。

【讨论】:

  • 我试过了,但它似乎不起作用。我做对了吗?def create_author_table(): cursor.execute("CREATE TABLE IF NOT EXISTS author(name VARCHAR(100),PRIMARY KEY (name))") cursor.execute("CREATE UNIQUE INDEX unq_author_name ON author(name)")
  • 如果name是主键,则不需要创建唯一索引。数据库不允许列中存在重复项。
  • 是的,这就是我的想法,但我不断收到此错误:IntegrityError: UNIQUE constraint failed: author.name
  • @aperez121 这就是数据库在做它的工作。在尝试“插入”之前处理错误或使用“SELECT”查询检查记录是否存在
猜你喜欢
  • 2012-09-23
  • 2013-04-28
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 2014-01-22
  • 2018-04-02
  • 2013-05-03
  • 2023-04-07
相关资源
最近更新 更多