在sqlite3 faq中,提到了一个为null值提供的整数主键会自动增加.但这不会发生在我身上.
复制,sqlite3中的表,CREATE TABLE dummy( serial_num INTEGER PRIMARY KEY, name TEXT);并使用python填充它,
import sqlite3 as lite
con = lite.connect('some.db')
cur=con.cursor()
data = "someone's name"
cur.execute("INSERT INTO dummy VALUES(NULL, ?)", data)
con.commit()
Run Code Online (Sandbox Code Playgroud)
第一个属性serial_num显示为空白,而name属性正常.当我这样做时,SELECT serial_num FROM dummy我只是得到一堆空白.我究竟做错了什么?
mu *_*ort 26
这是SQLite的一个怪癖.从精细手册:
根据SQL标准,PRIMARY KEY应始终表示NOT NULL.不幸的是,由于长期的编码监督,在SQLite中并非如此.除非列是INTEGER PRIMARY KEY,否则SQLite允许在PRIMARY KEY列中使用NULL值.我们可以改变SQLite以符合标准(我们将来可能会这样做),但是当发现疏忽时,SQLite的使用范围很广,如果我们解决问题,我们担心会破坏遗留代码.
关于INTEGER PRIMARY KEY的文档有点不清楚一个列需要什么才能成为这个特殊的INTEGER PRIMARY KEY自动递增,但实际情况是如果要使用NULL值,则列需要为NOT NULL插入时表示"给我下一个自动递增值":
create table dummy (
serial_num integer primary key not null,
name text
);
Run Code Online (Sandbox Code Playgroud)
如果你遗漏了not null,你需要像这样插入:
insert into dummy (name) values (?)
Run Code Online (Sandbox Code Playgroud)
获取自动增量值serial_num.否则,SQLite无法区分NULL意味着"给我下一个自动增量值"和NULL意味着"将NULL值放入,serial_num因为列允许NULL".
| 归档时间: |
|
| 查看次数: |
14817 次 |
| 最近记录: |