Answers:
您可以免费获得一个名为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将会失败或产生不正确的数据(值在错误的列中)。
select rowid from people;
是的,这是可能的。根据SQLite常见问题解答:
声明的列
INTEGER PRIMARY KEY
将自动递增。
这是官方SQLite文档必须对此主题说的(粗体和斜体是我的):
在AUTOINCREMENT关键字强加额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不严格需要应该避免。通常不需要。
在SQLite中,类型为INTEGER PRIMARY KEY 的列是ROWID 的别名(在WITHOUT ROWID表中除外),该别名始终是64位有符号整数。
在INSERT上,如果未 显式给 ROWID或INTEGER PRIMARY KEY列赋值,则将自动用未使用的整数 填充该整数,通常比当前使用的最大ROWID多一。无论是否使用AUTOINCREMENT关键字,都是如此。
如果在INTEGER PRIMARY KEY之后出现AUTOINCREMENT关键字,则会更改自动ROWID分配算法,以防止在数据库的生存期内重用ROWID。换句话说,AUTOINCREMENT的目的是防止重复使用先前删除的行中的ROWID。
你读过这个吗?如何创建AUTOINCREMENT字段。
INSERT INTO people
VALUES (NULL, "John", "Smith");
一个不应该AUTOINCREMENT
在附近指定关键字PRIMARY KEY
。创建自动增量主键并插入的示例:
$ 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
除了rowid之外,您可以定义自己的自动递增字段,但不建议这样做。当我们使用自动增加的rowid时,这始终是更好的解决方案。
该
AUTOINCREMENT
关键字强加了额外的CPU,内存,磁盘空间和磁盘I / O开销,如果没有严格要求,则应避免使用该关键字。通常不需要。
阅读此处以获取详细信息。
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
我知道这个答案有点晚了。
我回答这个问题的目的是,无论现在或将来使用SQLite遇到此类挑战并且遇到困难时,每个人都可以参考。
现在,回顾您的查询,应该是这样的。
CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));
它对我有效。像这样
万一您使用SQLite,建议您查看DB Browser for SQLite。也可以在不同平台上使用。
您所做的是正确的,但是“自动增量”的正确语法应该没有空格:
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永远不会再出现。
高温超导