我使用的是Python3.6和sqlite3
如果值不为null,我怎样才能将值插入数据库? 我已经通过插入200个重复行来测试数据库,只是为了确保INSERT或IGNORE工作良好,然后我得到200行全部由NULL填充。
我的INSERT代码是:
cursor.execute("""INSERT OR IGNORE INTO mytable (
column1,
column2,
column3,
column4, /* INT, PRIMARY KEY, UNIQUE
column5,
column6)
VALUES (?,?,?,?,?,?)""",
(
value1,
value2,
value3,
value4,
value5,
value6))
conn.commit()
如何解决这个问题?
现在,当我写这篇文章时,我认为可能因为我的PRIMARY KEY专栏不是第一篇?这可能是真的吗?
答案 0 :(得分:1)
INSERT OR IGNORE
说要插入但忽略冲突(不要这样做)。违反/不遵守CONSTRAINT时会发生冲突。
看起来你几乎没有CONSTRAINTS,只猜测隐含的CONSTRAINTS。也就是说,如果你有column4 INTEGER PRIMARY KEY
或与AUTOINCREMENT相同,那么隐含的CONSTRAINTS(其中2个)是UNIQUE NOT NULL。但是,这样的列( rowid 的别名)是特殊的,并且指定NULL会在列中分配一个在表中唯一的整数(即它唯一地标识该行)。
P.S。列位置没有区别。
因此,回到猜测,没有一列具有特定的CONSTRAINT编码,因此忽略不会被触发,因为没有CONFLICT,因为没有CONSTRAINTS。
您应该做的是,您不希望NULL成为有效值的每一列都是将列定义更改为在列定义中包含NOT NULL(在列名和列类型之后)。
而不是(例如)有: -
CREATE TABLE mytable (
column1 TEXT,
column2 TEXT,
column3 TEXT,
column4 INTEGER PRIMARY KEY,
column5 TEXT,
column6 TEXT
);
你会: -
CREATE TABLE mytable (
column1 TEXT NOT NULL,
column2 TEXT NOT NULL,
column3 TEXT NOT NULL,
column4 INTEGER PRIMARY KEY,
column5 TEXT NOT NULL,
column6 TEXT NOT NULL
);
因此使用上表和以下SQL: -
-- NOTE column4 omitted from list of columns thus null
INSERT OR IGNORE INTO mytable (column1,column2,column3,column5,column6) VALUES
(1,2,3,4,5), -- Will be inserted as no conflict
(6,7,null,null,10), -- conflict so ignored
(11,12,13,14,15), -- no conflict
(null,17,18,19,20), -- conflict
(21,22,23,24,25), -- no conflict
(26,null,28,29,230) -- conflict
;
即使尝试插入空值,也只会插入3行且没有空值: -
虽然如果表是根据上面的第一个CREATE SQL定义的,但INSERT SQL的结果应该是: -