2017-04-22 96 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

相關問題