[英]Python3 Sqlite3 - Not insert if value is null
我正在使用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列不是第一個? 會是真的嗎?
INSERT OR IGNORE
表示要執行插入BUT來忽略沖突(不要這樣做)。 違反/不遵守約束時會發生沖突。
看來您幾乎沒有約束,而猜測只有隱性約束。 也就是說,如果您具有column4 INTEGER PRIMARY KEY
或具有AUTOINCREMENT的相同column4 INTEGER PRIMARY KEY
,則其中的2個隱式CONSTRAINTS為UNIQUE NOT NULL。 但是,此類列( rowid的別名)是特殊的,並且指定NULL會導致為該列分配一個在表內唯一的整數(即,它唯一地標識該行)。
PS列位置沒有區別。
因此,回到猜測,這些列都沒有編碼為特定的CONSTRAINT,因此不會觸發忽略,因為不會有沖突,因為沒有約束。
對於不希望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的結果將是:-
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.