我有一个SQLite版本3的数据库,使用C#创建了一个应用程序来使用这个数据库。
我想在表中使用一个时间戳字段来处理并发,但是我注意到当我插入一条新记录时,这个字段没有被设置,它是空的。
例如,在MS SQL Server中,如果我使用时间戳字段,它将由数据库更新,我不必自己设置。这在SQLite中可行吗?
只需为字段声明默认值:
CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
不过,如果您的 INSERT
指令明确将该字段设置为 NULL
,那么它将被设置为 NULL
。
DATETIME
数据类型,但是它接受任何东西作为字段类型。 - CL.DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f','NOW','localtime'))
可以获得有意义的微秒值。 - Dietmar你可以在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;
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;
CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp TEXT);
create_date
和write_date
。我使用了你的代码,但是出现了“触发器递归级别过多”的错误。我不得不通过添加一个UPDATE OF
子句来排除update
触发器中的write_date
。我希望这是正确的做法。 - ChesuCRmodelBuilder.Entity<YourEntity>()
.Property(b => b.Timestamp)
.ValueGeneratedOnAddOrUpdate()
.IsConcurrencyToken()
.ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
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
将只给你一秒的粒度。 - Dietmar如果您使用SQLite DB-Browser,可以按照以下方式更改默认值:
建议在更改之前更新数据库,因为值中的错误格式可能会导致SQLLite浏览器出现问题。