我试图在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
。
9条答案
按热度按时间tag5nh1u1#
你可以免费得到一个ROWID,它存在于每个SQLite表中,不管你是否需要它。
如果包含INTEGER PRIMARY KEY类型的列,则该列指向自动ROWID列(是其别名)。
正如您所期望的那样,每当插入行时,ROWID(无论您如何称呼它)都会被分配一个值。如果在INSERT时显式分配非NULL值,它将获得该指定值,而不是自动增量。如果在INSERT时显式分配NULL值,它将获得下一个自动增量值。
此外,您应尽量避免:
并使用
第一个版本非常脆弱--如果您在表定义中添加、移动或删除列,INSERT要么失败,要么生成不正确的数据(值在错误的列中)。
dz6r00yl2#
是的,这是可能的。根据SQLite FAQ:
声明为
INTEGER PRIMARY KEY
的列将自动递增。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。
w1jd8yoj4#
SQLite AUTOINCREMENT是一个关键字,用于自动增加表中字段的值。当创建一个具有特定列名的表时,我们可以使用AUTOINCREMENT关键字自动增加字段值,以自动增加它。
关键字AUTOINCREMENT只能与INTEGER字段一起使用。语法:
AUTOINCREMENT关键字的基本用法如下:
例如,见下文:考虑按如下方式创建COMPANY表格:
现在,将以下记录插入表TB_COMPANY_INFO:
现在选择记录
hivapdat5#
你读过这个吗?我如何创建一个自动增量字段。
始终插入NULL作为ID。
eit6fx6z6#
不应在
PRIMARY KEY
附近指定AUTOINCREMENT
关键字。创建自动增量主键并插入的示例:将给予:
ffdz8vbo7#
除了rowid之外,你可以定义自己的自动递增字段,但不建议这样做。当我们使用自动递增的rowid时,这总是更好的解决方案。
AUTOINCREMENT
关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不是非常需要,应该避免使用。有关详细信息,请阅读here。
mrphzbgm8#
您所做的是正确的,但'auto increment'的正确语法应该是不带空格:
(还请注意,我将您的varchar更改为字符串,这是因为SQLite在内部将varchar转换为字符串,所以为什么要这么麻烦呢?)
那么你的插入应该是,尽可能标准的SQL语言:
虽然确实如果你省略id,它会自动增加和分配,我个人更喜欢不依赖于自动机制,因为将来可能会改变。
关于自动增量的说明:虽然,正如许多人指出的,SQLite的人不推荐它,但我不喜欢在不使用自动增量的情况下自动重用已删除记录的id。2换句话说,我 * 喜欢 * 已删除记录的id永远不会再出现。
高温加热
xtupzzrd9#
我知道这个回答有点晚了。
我给出这个答案的目的是供每个人参考,如果他们现在或将来遇到SQLite的这类挑战,并且他们在这方面遇到困难。
现在,回头看一下您的查询,它应该是这样的。
在我这边有效。就像这样,
如果您正在使用SQLite,我建议您查看DB Browser for SQLite。它也可以在不同的平台上工作。