如何在 SQLite 中使用自动时间戳?

我有一个 SQLite 数据库,版本3和我使用 C # 创建一个应用程序,使用这个数据库。

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

例如,在 MSSQLServer 中,如果我使用一个时间戳字段,它会被数据库更新,我不必自己设置它。这在 SQLite 中可行吗?

217819 次浏览

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

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

但是,如果您的 INSERT命令显式地将此字段设置为 NULL,那么它将被设置为 NULL

您可以在 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;

enter image description here

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

 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”来获取当前的系统日期,否则它将显示过去的一些时间或其他时间在您的数据库后插入时间在您的数据库。

谢谢,你..。

为了补充上面的答案..。

如果您正在使用 EF,请使用数据注释[时间戳]修饰属性,然后 转到上下文类中重写的 OnModelCreate,并添加以下 Fluent API 代码:

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

它将为将要插入到该表中的每个数据创建一个默认值。

阅读 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 函数被括在括号中! 用一个例子来说明这一点有多难?

玩得开心!

你可以使用触发器,效果很好

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;

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

  1. 选择数据库结构
  2. 选择表格
  3. 修改表
  4. 在“默认值”下面加上值: < em > = (datetime (‘ now’,‘ localtime’)

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