"AUTOINCREMENT"在 sqlite 中的用法3



请参考下面的SQL代码片段: 我的"自动增量"使用在所使用的上下文中是否正确。如果没有,任何人都可以提供建议我如何操作吗?

puzzle_table_creator = '''CREATE TABLE IF NOT EXISTS `Puzzle` (
`PuzzleNumber` INT NOT NULL ,
`ImageFileName` VARCHAR NOT NULL,
`Difficulty` VARCHAR NOT NULL,
`NoAttempts` INT NOT NULL,
PRIMARY KEY AUTOINCREMENT (`PuzzleNumber`)
); '''

简而言之,您必须在列级别编写AUTOINCREMENT代码,并且只能为专门使用 INTEGER 定义的列进行编码(而不是其他任何内容,例如 INT 或 BIGINT((不区分大小写,因此 InTeGer 会很好(并且定义为主键。

因此,您可以使用

puzzle_table_creator = '''CREATE TABLE IF NOT EXISTS `Puzzle` (
`PuzzleNumber` INTEGER AUTOINCREMENT NOT NULL ,
`ImageFileName` VARCHAR NOT NULL,
`Difficulty` VARCHAR NOT NULL,
`NoAttempts` INT NOT NULL,
PRIMARY KEY (`PuzzleNumber`)
); '''

或更常见的:-

puzzle_table_creator = '''CREATE TABLE IF NOT EXISTS `Puzzle` (
`PuzzleNumber` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
`ImageFileName` VARCHAR NOT NULL,
`Difficulty` VARCHAR NOT NULL,
`NoAttempts` INT NOT NULL
); '''

但是,您极不可能需要AUTOINCREMENT关键字。使用AUTOINCREMENT会导致效率低下(见下文(。因此,更好的解决方案很可能是使用:-

puzzle_table_creator = '''CREATE TABLE IF NOT EXISTS `Puzzle` (
`PuzzleNumber` INTEGER PRIMARY KEY NOT NULL ,
`ImageFileName` VARCHAR NOT NULL,
`Difficulty` VARCHAR NOT NULL,
`NoAttempts` INT NOT NULL
); '''

puzzle_table_creator = '''CREATE TABLE IF NOT EXISTS `Puzzle` (
`PuzzleNumber` INTEGER NOT NULL ,
`ImageFileName` VARCHAR NOT NULL,
`Difficulty` VARCHAR NOT NULL,
`NoAttempts` INT NOT NULL,
PRIMARY KEY (`PuzzleNumber`)
); '''

SQLite 中的自动增量

在SQLite中,AUTOINCREMENT与其他数据库不同。

其他数据库使用 AUTOINCREMENT(或等效(来指示在插入行时列应自动递增。

在SQLite中,每个表(WITHOUT ROWID表除外(列,称为rowid,通常是隐藏的。插入第一行时,此列将为 1,然后可能是 2,然后可能是 3,依此类推。该列是隐式唯一的,因此不能使用相同的数字。

rowid可以别名,这是通过指定the_column_name INTEGER PRIMARY KEY来完成的,因此只需编码即可紧密吸收其他数据库中AUTOINCREMENT的使用。

  • 根据建议的更好选择。

AUTOINCREMENT在SQLite中所做的是添加一个约束/规则,该约束/规则的值必须始终大于已用于表的任何值。它通过使用在必要时创建的称为sqlite_sequence的表来实现此目的。sqlite_sequence表将包含每个表的一行,其中一列 (seq( 表示最高rowid

如果没有AUTOINCREMENTsqlite 在插入行时有效地使用rowid = max(rowid) + 1

  • 请注意,当达到最大值(9223372036854775807(时,将使用随机未使用的值(如果有(应由于设备容量而存在((

AUTOINCREMENT编码时,SQLite 有效地使用效率较低的rowid = max(rowid,(SELECT seq FROM sqlite_sequence WHERE name = the_table_name)) + 1因为必须访问sqlite_sequence表。

  • 注意:如果达到最大值并尝试插入行,则会发生SQLITE_FULL错误。

注意

不能保证 rowid 会单调增加。

您可能希望阅读SQLite自动增量,它具有它的第一个语义:-

AUTOINCREMENT 关键字会增加额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是绝对需要,则应避免使用。通常不需要。

最新更新