私は 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 ON CONFLICT IGNORE」の代わりに「INSERT OR 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)
ところで、どの行が INSERTED に成功し、どの行が IGNORED ON CONFLICT になったかを知るにはどうすればよいでしょうか?