2013-01-05 61 views
0

我想INSERT or REPLACE INTO t1如果name已經存在。我知道如果設置了ID,則替換會起作用,但我需要它對名稱做出反應。SQLite:INSERT或REPLACE w/null PRIMARY KEY

import sqlite3 

def insert(name): 
    cur.execute('INSERT OR REPLACE INTO t1(name) VALUES(?)', [name])  

def select(): 
    return cur.execute('SELECT * FROM t1').fetchall() 


conn = sqlite3.connect('test') 
cur = conn.cursor() 

cur.execute('DROP TABLE IF EXISTS t1') 
cur.execute('''CREATE TABLE IF NOT EXISTS t1(
       id INTEGER PRIMARY KEY, 
       name TEXT NOT NULL 
       )''') 


insert('jack') 
insert('jack') 
insert('jack') 

print select() 

輸出

[(1, u'jack'), (2, u'jack'), (3, u'jack')] 

回答

1

INSERT or REPLACE ...會做只更換,如果有衝突。因爲你的name列不會碰撞,所以這個事件不會發生(至少不是name)。你需要讓name可碰撞:

CREATE UNIQUE INDEX IF NOT EXISTS iname ON t1 (name) 

還要注意的是,你不需要有id列,因爲sqlite3的對每個表ROWID

+0

好的,謝謝你的解釋。 「ROWID」將會是一個很大的幫助。 – Crispy