SQLIte如何设置自动增长的字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLIte如何设置自动增长的字段?相关的知识,希望对你有一定的参考价值。

1、创建测试临时表。

2、查看表中数据。

3、插入新纪录(所有列与表字段顺序一致)。

4、插入新记录(对于可空类型字段,插入空值时,可以省略该栏位。

5、插入新记录(对于VALUES后面按照表中顺序每个字段都赋值的时候,表名后面的栏位全部可以省略)。

6、修改表中数据。

7、删除表中数据,(删除完成后,查询其结果)。

参考技术A

1、首先用Navicat打开我们的数据库,点击打开表视图。

2、然后右键点击要设置自增字段的那个表,在弹出菜单上点击‘Design Table’(即表设计)。

3、打开表设计视图,点击选中要设置为自增的那个字段。

4、然后在下方的设置里,点击勾选上Auto Increment就行了。

5、如果要设置自增开始的数字,我们可以点击上方的‘Option’(选项),

6、打开后,在Auto Increment的输入框里输入数字就行了,比如输入100,自增字段就是从100开始自增。

参考技术B CREATE TABLE salespeople (
id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
commission_rate REAL NOT NULL
);
主键如果是INTEGER ,默认就是增长类型,其他字段可以通过申明AUTOINCREMENT ,但是最好不要这样做,因为自动增长主要是为主键设置的追问

已经建立的表。或从其它数据库导入的表如何添加一个这样的键?

追答

ALTER TABLE salespeople ADD new_col INTEGER AUTOINCREMENT

本回答被提问者和网友采纳
参考技术C CREATE TABLE [TableName]
(
[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
[Remark] VARCHAR(500)
) ;
参考技术D create table tb (
idx INTEGER PRIMARY KEY,
otherfiles
);

如何在 SQLite 中设置自动时间戳?

【中文标题】如何在 SQLite 中设置自动时间戳?【英文标题】:How to have an automatic timestamp in SQLite? 【发布时间】:2013-01-05 21:04:08 【问题描述】:

我有一个 SQLite 数据库,版本 3,我正在使用 C# 创建一个使用该数据库的应用程序。

我想在表中使用时间戳字段进行并发,但是我注意到当我插入新记录时,该字段没有设置,并且为空。

例如,在 MS SQL Server 中,如果我使用由数据库更新的时间戳字段,我不必自己设置。这在 SQLite 中可行吗?

【问题讨论】:

【参考方案1】:

如果您使用 SQLite DB-Browser,您可以通过以下方式更改默认值:

    选择数据库结构 选择表格 修改表格 在您的列中将值置于“默认值”下:=(datetime('now','localtime'))

我建议您之前更新您的数据库,因为值中的错误格式可能会导致 SQLLite 浏览器出现问题。

【讨论】:

如果它抱怨无法添加具有给定默认值的新列,那么(1)只需添加没有任何默认值的列,(2)保存,(3)修改再次表并输入在步骤 1 中创建的列的默认值。【参考方案2】:

您可以使用触发器。效果很好

CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME);


CREATE TRIGGER insert_Timestamp_Trigger
AFTER INSERT ON MyTable
BEGIN
   UPDATE MyTable SET Timestamp =STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

CREATE TRIGGER update_Timestamp_Trigger
AFTER UPDATE On MyTable
BEGIN
   UPDATE MyTable SET Timestamp = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

【讨论】:

【参考方案3】:

阅读datefunc 一个自动日期时间完成的工作示例是:

sqlite> CREATE TABLE 'test' ( 
   ...>    'id' INTEGER PRIMARY KEY,
   ...>    'dt1' DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), 
   ...>    'dt2' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')), 
   ...>    'dt3' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'))
   ...> );

让我们以启动自动日期时间完成的方式插入一些行:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);

存储的数据清楚地表明前两个是相同的但不是第三个功能:

sqlite> SELECT * FROM 'test';
1|2017-09-26 09:10:08|2017-09-26 09:10:08|2017-09-26 09:10:08.053
2|2017-09-26 09:10:56|2017-09-26 09:10:56|2017-09-26 09:10:56.894

注意 SQLite 函数用括号括起来! 在一个例子中展示它有多难?

玩得开心!

【讨论】:

【参考方案4】:

补充以上答案...

如果您使用的是 EF,请使用 Data Annotation [Timestamp] 装饰属性,然后 转到被覆盖的 OnModelCreating,在你的上下文类中,并添加这个 Fluent API 代码:

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

它将为将插入此表中的每个数据设置一个默认值。

【讨论】:

了解 Entity 在 Android 上的 Xamarin 应用程序中的表现?还没有开始测试,不过用 DAL 代替会很好。 我没有找到 sqliteHasDefault 所需的包。你知道我必须从 nuget 获得哪个包吗? @Simons0n,尝试使用这个 Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder 命名空间。【参考方案5】:

您可以使用自定义日期时间...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

使用 'NOW','localtime' 获取当前系统日期,否则它会在您的数据库中插入时间后在您的数据库中显示过去或其他时间。

谢谢你...

【讨论】:

在需要微秒时很有用;您可以使用 DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW','localtime'))`。只是说 DEFAULT CURRENT_TIMESTAMP 只会给你一秒的粒度。 这绝对有效!注意用括号括起来的strftime()!【参考方案6】:

您可以在 SQLite 的表中创建 TIMESTAMP 字段,请参见:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR(64),
    sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO my_table(name, sqltime) VALUES('test1', '2010-05-28T15:36:56.200');
INSERT INTO my_table(name, sqltime) VALUES('test2', '2010-08-28T13:40:02.200');
INSERT INTO my_table(name) VALUES('test3');

这是结果:

SELECT * FROM my_table;

【讨论】:

无法添加具有非常量默认值的列(ALTER TABLE "main"."xxx_data" ADD COLUMN "created_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) TIMESTAMP 在 SQLite 中不是真正的类型。他们的类型关联文档使用 DATETIME。【参考方案7】:

只需为字段声明一个默认值:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

但是,如果您的INSERT 命令明确将此字段设置为NULL,它将被设置为NULL

【讨论】:

这不完全等同于 SQL Server 的时间戳,因为它是基于系统时钟的;如果您更改时钟,则该值可能会倒退。在 SQL Server 中,时间戳值总是递增的。 @Matthieu 没有 DATETIME data 类型,但 SQLite 接受任何 field 类型。 @Matthieu 在您提供的链接中的 SQLite 中提到了 DATETIME 数据类型。阅读 2.2 关联名称示例 这似乎不包括 UPDATE 语句。看来触发器是执行此操作的唯一方法。 @CL 对不起,你是对的。我错误地合并了你的答案和 javed 的。使用DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime')),实际上可以获得有意义的微秒值。

以上是关于SQLIte如何设置自动增长的字段?的主要内容,如果未能解决你的问题,请参考以下文章

在SqlServer中怎样设置自动增长字段

为啥我在sqlite数据库中插入数据后罗列列中没有自动增长码自动增长码是空的

Mysql数据库自增长如何设置?

sqlserver中如何设置两个自动增长的表示列

SQL Server中怎样设置id号自动增长

mysql如何将表的字段设为自增长