sqlite 复合主键和自动递增ID

new9mtju  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(354)

我正在尝试为我的表格构建一个复合主键。它们还应该有一个自我递增的ID。我的问题是,当我使用复合主键时,ID变为空(如图所示)
here it works as it should but no composite key
here the id is NULL no matter what
我尝试了不同的语法,也尝试了NOT NULL和AUTOINCREMENT等关键词,但似乎都不起作用。
以下是不带组合键的代码

mystr = "CREATE TABLE IF NOT EXISTS KM%s(id INTEGER PRIMARY KEY, date TEXT, client INTEGER)"%(month.replace('-',"))
print(mystr)
c.execute(mystr) #create a table
conn.commit()'''

以下是带有组合键的代码

mystr = "CREATE TABLE IF NOT EXISTS KM%s(id INTEGER, date TEXT, client INTEGER, primary key (id, client)"%(month.replace('-',"))
print(mystr)
c.execute(mystr) #create a table
conn.commit()
8gsdolmq

8gsdolmq1#

我确信我在过去使用过不是主键的自动递增的整型列,但现在它肯定不适用于SQLite。
我必须附和@forpas在评论中已经说过的话,你就是不能这样做。
解决方案是向id添加唯一约束,并在执行过程中以编程方式生成ID。您不需要跟踪您当前的最大ID,因为您只需询问SQLite最大ID是多少:

SELECT MAX(id) FROM KM<month>;

将该值递增1并将其包含在INSERT INTO语句中。
我想提供几个小贴士:
使用两个整数作为组合键不是一个好主意。以复合键1315为例。是ID为1的客户端315、ID为13的客户端15还是ID为131的客户端5?诚然,主键只用于搜索,在许多情况下不必是唯一的,但使用整数通常不能很好地工作。
第二个技巧是不要为每个月创建一个新的数据库表。一个非常好的规则是,结构相同的表应该合并到一个表中。在本例中,您将添加一个名为month的列(实际上,它将是‘Date’,然后您将按月进行搜索),并将所有内容保存在一个表中,而不是每月一个表。

相关问题