在sqlite3中没有自动增量的Integer主键

yay*_*ayu 20 python sqlite

在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".