SQLite 有自动增量吗?

我试图在 Sqlite3中创建一个自动递增 primary key的表。我不确定这是否真的可行,但我希望只有指定其他领域。

例如:

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20));

然后,当我添加一个值时,我希望只需要做:

INSERT INTO people
VALUES ("John", "Smith");

这有可能吗?

我在 Windows7的 cygwin下运行 sqlite3

202796 次浏览

你读过这个吗? 如何创建 AUTOINCREMENT 字段。

INSERT INTO people
VALUES (NULL, "John", "Smith");

是的,这是可能的。根据 SQLite 常见问题解答:

声明为 INTEGER PRIMARY KEY的列将自动递增。

你可以免费得到一个,叫 ROWID。无论您是否要求,每个 SQLite 表中都存在这个属性。

如果包含 INTEGERPRIMARYKEY 类型的列,则该列指向(是)自动 ROWID 列的别名。

ROWID (不管您如何称呼它)在您插入一行时都会被赋值,正如您所期望的那样。如果在 INSERT 上显式分配非 NULL 值,它将获得指定的值,而不是自动增量。如果在 INSERT 上显式地赋值 NULL,它将获得下一个自动增量值。

此外,你应该尽量避免:

 INSERT INTO people VALUES ("John", "Smith");

和使用

 INSERT INTO people (first_name, last_name) VALUES ("John", "Smith");

取而代之。第一个版本非常脆弱ーー如果在表定义中添加、移动或删除列,INSERT 将失败或生成不正确的数据(值在错误的列中)。

除了 rowid 之外,您还可以定义自己的自动增量字段,但是不推荐这样做。当我们使用自动增加的 rowid 时,它总是更好的解决方案。

AUTOINCREMENT关键字增加了额外的 CPU、内存、磁盘空间和 磁盘 I/O 开销,如果不是严格需要,应该避免 通常不需要。

有关详细信息,请阅读 给你

SQLiteAUTOINCREMENT 是用于自动递增表中字段值的关键字。在创建具有特定列名的表时,可以使用 AUTOINCREMENT 关键字自动递增字段值。

关键字 AUTOINCREMENT 只能与 INTEGER 字段一起使用。 句法:

AUTOINCREMENT 关键字的基本用法如下:

CREATE TABLE table_name(
column1 INTEGER AUTOINCREMENT,
column2 datatype,
column3 datatype,
.....
columnN datatype,
);

例如: 考虑按以下方式创建 COMPany 表:

sqlite> CREATE TABLE TB_COMPANY_INFO(
ID INTEGER PRIMARY KEY   AUTOINCREMENT,
NAME           TEXT      NOT NULL,
AGE            INT       NOT NULL,
ADDRESS        CHAR(50),
SALARY         REAL
);

现在,将以下记录插入表 TB _ COMPany _ INFO:

INSERT INTO TB_COMPANY_INFO (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'MANOJ KUMAR', 40, 'Meerut,UP,INDIA', 200000.00 );

现在选择记录

SELECT *FROM TB_COMPANY_INFO
ID      NAME            AGE     ADDRESS             SALARY
1       Manoj Kumar     40      Meerut,UP,INDIA     200000.00

不应该在 PRIMARY KEY附近指定 AUTOINCREMENT关键字。 创建自动递增主键并插入的示例:

$ sqlite3 ex1


CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL);


INSERT INTO room(name, home_id) VALUES ('test', 'home id test');


INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2');


SELECT * FROM room;

将给予:

1|test|home id test
2|test 2|home id test 2

我知道这个答案有点晚了。< br/> 我给出这个答案的目的是供大家参考,如果他们现在或将来在使用 SQLite 时遇到这种类型的挑战,并且遇到困难的话。

现在,回头看看你的问题,应该是这样的。

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));

我这边没问题,像这样,

enter image description here

以防您正在使用 SQLite,我建议您查看 SQLite 数据库浏览器。也可以在不同的平台上工作。

从今天开始2018年6月


以下是 SQLite 官方文档在这个问题上的看法(粗体和斜体是我的看法) :

  1. 自动增量关键字增加了额外的 CPU、内存、磁盘空间和 如果不是严格需要,应该避免磁盘 I/O 开销和 < strong > 通常不需要。

  2. 在 SQLite 中,类型 < strong > INTEGER PRIMARYKEY 的列是 ROWID (除非在 WITHOUT ROWID 表中) ,它始终是64位有符号的 整数

  3. 在 INSERT 中,如果 ROWID 或 INTEGERPRIMARYKEY 列不是 显式地给出一个值,然后它将自动填充一个 未使用的整数,比当前中的最大 ROWID 多一个 通常 不管是否使用 AUTOINCREMENT,这都是正确的 关键字。

  4. 如果出现 自动增量关键字 在整数主键之后,则 将自动 ROWID 分配算法更改为 防止再次使用 在数据库的生命周期内,ROWID 的数量不会减少 AUTOINCREMENT 的目的是防止 ROWID 的重用 以前删除的行

你所做的是正确的,但是正确的“自动递增”语法应该是没有空格的:

CREATE TABLE people (id integer primary key autoincrement, first_name string, last_name string);

(还请注意,我把你的 varchars 改成了字符串。这是因为 SQLite 在内部将 varchar 转换为字符串,所以为什么要这么麻烦呢?)

那么您的插入应该尽可能标准地使用 SQL 语言:

INSERT INTO people(id, first_name, last_name) VALUES (null, 'john', 'doe');

虽然如果省略 id,它会自动增加和赋值,但我个人不喜欢依赖自动机制,因为这种机制将来可能会发生变化。

关于自动增量的一个注意事项: 尽管许多人指出,SQLite 人员不推荐使用自动增量,但是如果不使用自动增量,我不喜欢自动重用已删除记录的 id。换句话说,我 喜欢,一个被删除的记录的 id 将永远,永远不会再出现。

高温