需要帮助了解SQLite的自动增量吗

需要帮助了解SQLite的自动增量吗,sql,database,sqlite,Sql,Database,Sqlite,我正在从这个网站学习SQLite: 我正在读他们关于指挥部的文章 我的问题与他们解释此功能为何有用有关: 使用自动增量属性的主要目的是 防止SQLite重用未使用的值或以前删除的行中的值 我对这个解释感到困惑,因为它没有详细解释这句话的含义 如果此功能针对不同的平台或引擎在不同的包npm包中的特定包实现不同,请有人提供更多关于后台发生的情况的详细信息 此外,更重要的是,请举例说明需要使用此功能的用例,以及正确和不正确的使用方式 谢谢大家 防止SQLite重用未使用的值或来自 以前删除的行 AUT

我正在从这个网站学习SQLite:

我正在读他们关于指挥部的文章

我的问题与他们解释此功能为何有用有关:

使用自动增量属性的主要目的是

防止SQLite重用未使用的值或以前删除的行中的值

我对这个解释感到困惑,因为它没有详细解释这句话的含义

如果此功能针对不同的平台或引擎在不同的包npm包中的特定包实现不同,请有人提供更多关于后台发生的情况的详细信息

此外,更重要的是,请举例说明需要使用此功能的用例,以及正确和不正确的使用方式

谢谢大家

防止SQLite重用未使用的值或来自 以前删除的行

AUTOINCREMENT属性确保新生成的id是唯一的,不是来自该列中任何已使用的id,也不应该来自已删除的id。它主要用于表的主键中,在主键中我们需要唯一的属性,而这个属性到目前为止还没有被使用过

在大多数关系数据库中,都有自动增量属性,但在Oracle中,我看到了类似于自动增量属性的序列


例如:如果您有10行,其中包含名为id的自动增量列,并且其值从1到10。现在,删除所有行并插入新行,新行的id=11,因为已经使用了1到10。您不需要指定id值,因为它会通过检查以前插入的值自动填充新行id值

此功能通常用于表的主键,我个人更喜欢将其命名为ID,如下所示:

CREATE TABLE MYTABLE(
    ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    ...
);
如果您正在学习SQLite,您应该知道表的主键对于该表中的每个记录都必须是唯一的。 因此,如果在主键上没有自动递增的情况下将记录插入表中,数据库将强制您指定每个新记录的ID

如果您的表中已经有一些记录,您可能会问自己一个问题,比如我应该在记录中输入什么ID以确保它是唯一的

这就是创建AUTOINCREMENT的目的。如果在表的主键上设置了AUTOINCREMENT,则在插入记录时不再需要指定它,因此不再需要考虑将什么ID放在那里

现在它是如何工作的。如果在表的主键上设置了AUTOINCREMENT,则会在数据库中存储一个特殊数量的添加记录(我们将其命名为添加的变量)。使用此表发出INSERT命令时,其ID的计算如下

added + 1
添加的变量将自动递增

最初,added的值为0

例如,正如Akash KC已经说过的,如果表中添加了10条记录,那么下一条记录的ID将是11


细节是,AUTOINCREMENT不介意删除—如果您获取一个空表,向其中添加10条记录,例如删除其中一条ID为5的记录,然后添加一条新记录,其ID也将为11。

我非常确定,它们的目的是防止SQLite重用已经使用过的值,而不是负值。考虑到写过该网站的人甚至懒得在网站上添加他们的名字或任何其他信息,我对内容持保留态度。因此,如果你在主键上没有自动递增的情况下向表中插入一条记录,数据库将迫使你指定每条新记录的ID。不是真的。整数主键足以使SQLite自动为主键生成值:在INSERT中,如果未显式为ROWID或INTEGER主键列指定值,则会自动使用未使用的整数填充该列,通常比当前使用的最大ROWID多出一个整数。无论是否使用AUTOINCREMENT关键字,这都是正确的。噢。我不知道。那么我的答案完全错了?你可能应该让你的一个特定的ID只给一个记录一次。“自动增量”可确保如果一条记录在另一条记录之后插入,它的ID会更高。但是,由于删除或回滚,可能会出现间隙。序列似乎更强大。您可以自己创建一个,并请求获取下一个X编号以进行批处理,这样可以确保插入到一起的元素具有无间隙的编号。如果有多个进程正在向表中写入数据,则使用autoincrement似乎不可能做到这一点。@maraca:你说得对。根据我的经验,我在Oracle中没有发现任何autoincrement属性,所以我只想让OP知道序列作为autoincrement的用法,是的,这是一个很好的答案,我只是想说,尽管序列使用起来有点困难
它有它的优点,但通常只有一个概念可用,因此没有选择。SQLite中没有截断。@downvoter:请注意发表评论,以便我可以改进我的答案!!!