2017-04-22 101 views
1

下面是应该将作者名称添加到表中的代码的一部分。如何仅在条目尚不存在的情况下才能插入表格?

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笔记本使用python 2.7和sqlite以防万一需要知道。

我意识到这个网站上已经有很多类似的问题,但我已经看过他们,我没有任何运气。这是我第一次使用python,所以我一般没有经验。

+0

我强烈建议不要将名称命名为主键。唯一的索引是,但主键,没有。顺便说一句,欢迎来到Stackoverflow,写出格式良好的第一个问题。 – Caltor

回答

0

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

我会担心一些竞争条件下,相同的名称可以输入多次。

+0

我试过了,但它似乎没有工作。 “create 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作者(姓名)“)' – aperez121

+0

如果'name'是主键,则不需要创建唯一索引。数据库不允许在列中重复。 –

+0

是的,这就是我的想法,但我不断收到此错误:IntegrityError:UNIQUE约束失败:author.name – aperez121

相关问题