165

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

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

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

4

7 回答 7

255

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

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

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

于 2013-01-22T15:40:39.457 回答
78

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

在此处输入图像描述

于 2013-12-17T06:24:45.973 回答
17

阅读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 函数用括号括起来!在一个例子中展示它有多难?

玩得开心!

于 2017-09-26T06:17:33.220 回答
10

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

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;
于 2018-05-30T12:44:24.737 回答
6

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

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

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

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

于 2017-06-05T18:44:03.273 回答
4

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

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

感谢您...

于 2017-02-20T06:44:18.947 回答
2

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

  1. 选择数据库结构
  2. 选择表
  3. 修改表
  4. 在您的列中,将值放在“默认值”下:=(datetime('now','localtime'))

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

于 2020-04-12T08:25:36.733 回答