SQLite AUTO_INCRMENT id 字段不起作用

问题描述 投票:0回答:3

我正在尝试使用 python 创建一个数据库来执行 SQL 命令(针对 CS50x 问题集 7)。

我创建了一个表,其中

id
字段设置为
AUTO_INCREMENT
,但数据库中的字段仅由
NULL
填充。我只是希望它有一个从 1 开始递增的 id。

我尝试在网上搜索,看看我是否使用了正确的语法,但找不到任何明显的东西,也找不到其他有类似问题的人,所以任何帮助将不胜感激。

这是我正在运行的 SQL 命令:

# For creating the table
db.execute("""
            CREATE TABLE students (
                id INTEGER AUTO_INCREMENT PRIMARY KEY,
                first_name VARCHAR(255) NOT NULL,
                middle_name VARCHAR(255) DEFAULT (NULL),
                last_name VARCHAR(255) NOT NULL,
                house VARCHAR(10),
                birth INTEGER
            );
       """)

# An example insert statement
db.execute("""
            INSERT INTO students (
                first_name,
                middle_name,
                last_name,
                house,
                birth
            )
            VALUES (
                ?, ?, ?, ?, ?
            );
    """, "Harry", "James", "Potter", "Gryffindor", 1980)

这是

phpliteadmin
中显示的数据库架构的屏幕截图:

这是生成的数据库的屏幕截图:

python sql sqlite cs50
3个回答
2
投票

我的猜测是您正在使用 SQLite 和 phpliteadmin 而不是 MySql,在这种情况下是这样的:

id INTEGER AUTO_INCREMENT PRIMARY KEY

不是 自增主键的正确定义。

事实上,该列的数据类型设置为

INTEGER AUTO_INCREMENT
,如
phpliteadmin
中所示,根据3.1。测定柱亲和力,具有
INTEGER
亲和力。
尽管如此,它是表格的
PRIMARY KEY
,但这允许
NULL
值。

拥有整数主键的正确语法是这样的:

id INTEGER PRIMARY KEY AUTOINCREMENT 

1
投票

如果你的语句执行正确,这种情况就不会发生。

我注意到您没有检查代码中的错误。你应该这样做!

我的猜测是,该表是已经创建的,没有

auto_increment
属性。
create table
正在生成错误,您正在插入旧版本。

您可以通过在创建表之前删除该表来解决此问题。您还应该修改代码以检查错误。


0
投票

SQLite CREATE 语句的正确语法是:

创建表学生( id 整数, 名字 VARCHAR(255) NOT NULL, middle_name VARCHAR(255) 默认值 (NULL), 姓氏 VARCHAR(255) NOT NULL, 房子 VARCHAR(10), 出生整数, 主键(id自动增量) )

© www.soinside.com 2019 - 2024. All rights reserved.