尽管使用带有主键的insert or ignore
,但是当字段为空时我会获得多个插入。我还尝试添加一个唯一的索引,只是为了确定。当主键不等于任何现有行时,我只想要新的插入。
根据sqlite.org/nulls.html nulls are distinct in a UNIQUE column
,不应发生这些重复插入。
我正在做这个插入:
INSERT OR IGNORE INTO facts (
created,
inserted,
author,
kind,
what,
field,
val
) VALUES (?, ?, ?, ?, ?, ?, ?)
使用此表:
CREATE TABLE IF NOT EXISTS facts (
created TEXT,
inserted TEXT,
author TEXT,
kind TEXT,
what TEXT,
field TEXT,
val TEXT,
PRIMARY KEY(created, author, kind, what, field, val)
)
并在多次执行相同的插入后得到此结果:
sqlite> select * from facts where what='vot1dafjt95326qvs8kn' order by inserted;
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643060|test_user_id|TaskFact|vot1dafjt95326qvs8kn|created|2014-01-29T09:30:44.000000
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643152|test_user_id|TaskFact|vot1dafjt95326qvs8kn|alarm|
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643315|test_user_id|TaskFact|vot1dafjt95326qvs8kn|deleted|
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643380|test_user_id|TaskFact|vot1dafjt95326qvs8kn|description|
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643445|test_user_id|TaskFact|vot1dafjt95326qvs8kn|location|KG45
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643641|test_user_id|TaskFact|vot1dafjt95326qvs8kn|summary|semtid
2014-01-29T09:30:44.000000|2015-07-23T13:23:10.643780|test_user_id|TaskFact|vot1dafjt95326qvs8kn|when|TS('2014-03-14T07:00:00.000000', '2014-03-14T11:00:00.000000')
2014-01-29T09:30:44.000000|2015-07-23T13:23:35.559110|test_user_id|TaskFact|vot1dafjt95326qvs8kn|alarm|
2014-01-29T09:30:44.000000|2015-07-23T13:23:35.559273|test_user_id|TaskFact|vot1dafjt95326qvs8kn|deleted|
2014-01-29T09:30:44.000000|2015-07-23T13:24:12.548969|test_user_id|TaskFact|vot1dafjt95326qvs8kn|alarm|
2014-01-29T09:30:44.000000|2015-07-23T13:24:12.549186|test_user_id|TaskFact|vot1dafjt95326qvs8kn|deleted|
2014-01-29T09:30:44.000000|2015-07-23T13:25:39.638743|test_user_id|TaskFact|vot1dafjt95326qvs8kn|alarm|
2014-01-29T09:30:44.000000|2015-07-23T13:25:39.638906|test_user_id|TaskFact|vot1dafjt95326qvs8kn|deleted|
多次插入deleted
和alarm
行,但其他行只插入一次。
我正在使用sqlite3
模块从python3进行插入。
答案 0 :(得分:1)
你错误解释“空格在UNIQUE列中是不同的”。这意味着,出于UNIQUE
约束的目的,NULL == NULL
为false,因此可以插入多个NULL
。
请注意,从技术上讲,您的列是PRIMARY KEY
,而不是UNIQUE
。在SQL中,主键必须是NOT NULL
;由于错误转换功能,SQLite仅支持NULL
主键。