Python3 Sqlite3-如果值为null,则不插入
我正在使用Python3.6和sqlite3 如何仅在值不为null时向数据库插入值? 我已经通过插入200个重复的行来测试了数据库,只是为了确保INSERT或IGNORE工作正常,然后我得到了全部由NULL填充的200行 我的插入代码是:Python3 Sqlite3-如果值为null,则不插入,python,python-3.x,sqlite,Python,Python 3.x,Sqlite,我正在使用Python3.6和sqlite3 如何仅在值不为null时向数据库插入值? 我已经通过插入200个重复的行来测试了数据库,只是为了确保INSERT或IGNORE工作正常,然后我得到了全部由NULL填充的200行 我的插入代码是: cursor.execute("""INSERT OR IGNORE INTO mytable ( column1, column2, column3, column4, /* INT, PRIMARY KEY, UN
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()
如何解决这个问题
现在,当我写这篇文章的时候,我想可能是因为我的主键栏不是第一个?这可能是真的吗?
插入或忽略是指执行插入操作,但忽略冲突(不要执行)。违反/不遵守约束时会发生冲突
看起来您几乎没有约束,并且猜测只有隐式约束。也就是说,如果您有column4 INTEGER主键
或与AUTOINCREMENT相同的主键,则隐式约束(其中2个)是唯一的且不为NULL。但是,这样的列(rowid的别名)是特殊的,在被分配给表中唯一的整数的列中指定NULL结果(即,它唯一地标识行)
另外,立柱位置没有区别
因此,回到猜测,所有列都没有编码特定的约束,因此不会触发忽略,因为没有约束,所以不会发生冲突
对于不希望NULL为有效值的每一列,您应该做的是更改列定义以在列定义中包含NOTNULL(在列名和列类型之后)
因此,与其(作为示例)拥有:-
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的结果将是:-
为列提供NOTNULL约束