簡體   English   中英

Python3 SQLite3-如果值為null則不插入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM