【问题标题】:SQLite AUTO_INCREMENT id field not workingSQLite AUTO_INCREMENT id 字段不起作用
【发布时间】:2020-12-30 13:05:10
【问题描述】:

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

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

我已经尝试在线搜索以查看我是否使用了正确的语法并且找不到任何明显的东西,也找不到其他有类似问题的人,因此非常感谢任何帮助。

这是我正在运行的 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中显示的数据库架构的屏幕截图:

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

【问题讨论】:

  • 我认为您需要为 id 列添加 NOT NULL
  • @Akina 如果表已经存在,那么应用程序将崩溃并且不会插入任何行。这里的问题是 OP 没有使用 MySql 而是使用 SQLite。
  • @Akina 抱歉,在我清除 .db 文件的程序开头我没有包含一行

标签: python sql sqlite cs50


【解决方案1】:

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

id INTEGER AUTO_INCREMENT PRIMARY KEY

不是auto increment primary key的正确定义。

其实这个列的数据类型设置为INTEGER AUTO_INCREMENT,可以看到phpliteadmin,根据3.1. Determination Of Column Affinity,有INTEGERaffinity。
尽管如此,它是表的PRIMARY KEY,但这允许NULL 值。

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

id INTEGER PRIMARY KEY AUTOINCREMENT 

【讨论】:

    【解决方案2】:

    如果您的语句正确执行,这不会发生。

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

    我的猜测是该表已经在没有auto_increment 属性的情况下创建。 create table 正在生成错误,您正在插入旧版本。

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

    【讨论】:

    • 该表在我创建之前不存在,文件中有一行我清空了现有的 .db 文件,并且我已经检查过它是否有效。我还尝试在 phpliteadmin 中删除学生表并重新运行我的脚本,但它仍然没有更新 id 变量。
    • 感谢您的回答,请问如何检查 SQL 语句中的错误信息?
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 2019-11-11
    • 2018-07-22
    • 1970-01-01
    • 2015-05-19
    • 2022-01-23
    • 2011-01-03
    • 2010-12-11
    相关资源
    最近更新 更多