我使用 Python 2.7 和 SQLite3。
这是代码:
#!/usr/bin/env python
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE stocks
(transctionid text not null collate nocase primary key,
trans text,
symbol text not null,
qty real,
price real)''')
purchases = [('B1Jan', 'BUY', 'IBM', 1000, 45.00),
('C2Jan', 'BUY', 'MSFT', 1000, 72.00),
('D3Jan', 'SELL', 'IBM', 500, 53.00),
('d3jan', 'SELL', 'IBM', 500, 53.00),
('', 'SELL', 'IBM', 500, 53.00),
('E5Jan', 'SELL', '', 500, 53.00),
]
c.executemany('INSERT OR IGNORE INTO stocks VALUES (?,?,?,?,?)', purchases)
conn.commit()
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
print row
conn.close()
结果是:
(u'B1Jan', u'BUY', u'IBM', 1000.0, 45.0)
(u'D3Jan', u'SELL', u'IBM', 500.0, 53.0)
(u'', u'SELL', u'IBM', 500.0, 53.0)
(u'E5Jan', u'SELL', u'', 500.0, 53.0)
(u'C2Jan', u'BUY', u'MSFT', 1000.0, 72.0)
INSERT OR IGNORE 仅适用于“PRIMARY KEY”约束。“NOT NULL”约束不起作用。
根据http://www.sqlite.org/lang_conflict.html:
对于 INSERT 和 UPDATE 命令,关键字“ON CONFLICT”被替换为“OR”,这样语法读起来更自然。例如,我们用“INSERT OR IGNORE”代替“INSERT ON CONFLICT IGNORE”。... ON CONFLICT 子句适用于 UNIQUE 和 NOT NULL 约束(以及在本节中与 UNIQUE 约束相同的 PRIMARY KEY 约束)。
我预期的结果是:
(u'B1Jan', u'BUY', u'IBM', 1000.0, 45.0)
(u'D3Jan', u'SELL', u'IBM', 500.0, 53.0)
(u'C2Jan', u'BUY', u'MSFT', 1000.0, 72.0)
顺便说一句,我怎么知道哪一行插入成功,哪一行在冲突中被忽略?