代码:
import sqlite3
c = sqlite3.Connection(':memory:')
c.execute('CREATE TABLE foo(a INTEGER, b VARCHAR(8), PRIMARY KEY(a, b))')
c.execute('INSERT INTO foo(a) VALUES (1)')
c.execute('INSERT INTO foo(a) VALUES (1)')
print(c.execute('SELECT * FROM foo').fetchall())
输出:
^{pr2}$为什么SQLite插入具有重复主键的行?我怎么解决这个问题?在
SQL PK(主键)表示UNIQUE NOT NULL。你不应该期望PK的值中有一个NULL,更不用说只有一个了。您应该声明PK列不为NULL,并且不在其中放入NULL。在
SQL As Understood By SQLite:
由于PK中的NULL是针对SQL的,所以当在PK中约束和操作带有NULL的表时,SQLite选择做什么似乎是没有意义的。但它使用了通常的SQL解释,即NULL不等于NULL,以达到UNIQUE的目的。这与声明列集UNIQUE NULL类似。因此,作为一个约束,SQLite PK是UNIQUE的同义词,而不是UNIQUE NOT NULL。在
SQLite和许多其他SQL数据库一样,出于唯一性的目的,将两个
NULL
视为不同的值(部分原因是在SQL中,NULL == NULL
为false)。在我不相信有办法改变这种行为。作为一种解决方法,您可以使用列
b
中的空字符串作为“no value”。在相关问题 更多 >
编程相关推荐