SQLite中是否有自动增量?

7qhs6swi  于 2023-01-26  发布在  SQLite
关注(0)|答案(9)|浏览(247)

我试图在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");

这可能吗?
我在Windows 7中的cygwin下运行sqlite3

tag5nh1u

tag5nh1u1#

你可以免费得到一个ROWID,它存在于每个SQLite表中,不管你是否需要它。
如果包含INTEGER PRIMARY KEY类型的列,则该列指向自动ROWID列(是其别名)。
正如您所期望的那样,每当插入行时,ROWID(无论您如何称呼它)都会被分配一个值。如果在INSERT时显式分配非NULL值,它将获得该指定值,而不是自动增量。如果在INSERT时显式分配NULL值,它将获得下一个自动增量值。
此外,您应尽量避免:

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

并使用

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

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

dz6r00yl

dz6r00yl2#

是的,这是可能的。根据SQLite FAQ:
声明为INTEGER PRIMARY KEY的列将自动递增。

h43kikqp

h43kikqp3#

截至今天-2018年6月

下面是official SQLite documentation对这个问题的看法(粗体和斜体是我的):
1.AUTOINCREMENT关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不是严格需要,则应避免使用**。通常不需要使用**。
1.在SQLite中,类型为INTEGER PRIMARY KEY的列是****ROWID(WITHOUT ROWID表格除外)的别名,它始终是64位有符号整数。
1.在INSERT中,如果ROWID或INTEGER PRIMARY KEY列没有显式给定值,则它将自动填充未使用的整数, 通常 * 比当前使用的最大ROWID大一。无论是否使用AUTOINCREMENT关键字,都是如此。
1.如果
AUTOINCREMENT
关键字出现在INTEGER PRIMARY KEY之后,则会将自动ROWID分配算法更改为防止在数据库的生存期内重用
ROWID。**换句话说,AUTOINCREMENT的用途是防止重用以前删除的行的ROWID。

w1jd8yoj

w1jd8yoj4#

SQLite AUTOINCREMENT是一个关键字,用于自动增加表中字段的值。当创建一个具有特定列名的表时,我们可以使用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
hivapdat

hivapdat5#

你读过这个吗?我如何创建一个自动增量字段。

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

始终插入NULL作为ID。

eit6fx6z

eit6fx6z6#

不应在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
ffdz8vbo

ffdz8vbo7#

除了rowid之外,你可以定义自己的自动递增字段,但不建议这样做。当我们使用自动递增的rowid时,这总是更好的解决方案。
AUTOINCREMENT关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不是非常需要,应该避免使用。
有关详细信息,请阅读here

mrphzbgm

mrphzbgm8#

您所做的是正确的,但'auto increment'的正确语法应该是不带空格:

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

(还请注意,我将您的varchar更改为字符串,这是因为SQLite在内部将varchar转换为字符串,所以为什么要这么麻烦呢?)
那么你的插入应该是,尽可能标准的SQL语言:

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

虽然确实如果你省略id,它会自动增加和分配,我个人更喜欢不依赖于自动机制,因为将来可能会改变。
关于自动增量的说明:虽然,正如许多人指出的,SQLite的人不推荐它,但我不喜欢在不使用自动增量的情况下自动重用已删除记录的id。2换句话说,我 * 喜欢 * 已删除记录的id永远不会再出现。
高温加热

xtupzzrd

xtupzzrd9#

我知道这个回答有点晚了。
我给出这个答案的目的是供每个人参考,如果他们现在或将来遇到SQLite的这类挑战,并且他们在这方面遇到困难。
现在,回头看一下您的查询,它应该是这样的。

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

在我这边有效。就像这样,

如果您正在使用SQLite,我建议您查看DB Browser for SQLite。它也可以在不同的平台上工作。

相关问题