4

桌子:

CREATE TABLE logaction
(
  actype varchar(8) not null,
  actime DATETIME not null,
  devid int not null
);

SQL:

insert into logaction values ('TEST', '2013-08-22', 1);
insert into logaction values ('TEST', '2013-08-22 09:45:30', 1);
insert into logaction values ('TEST', 'xyz', 2); // shouldn't this fail?

不管 actime 列的非日期时间值如何,最后一条记录都会进入表中。为什么以及如何强制只输入好的数据?

这是一个SQL Fiddle

4

3 回答 3

7

好吧,Sqlite 中没有 DATETIME 类型...

SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in Greenwich 
on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. 

应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

文档

你可以这样创建你的表,它不会改变任何东西。

CREATE TABLE logaction
(
  actype varchar(8) not null,
  actime NonexistingType not null,
  devid int not null
);
于 2013-08-22T14:10:23.943 回答
3

这是一个简单的解决方法:

CREATE TABLE logaction
(
  actype varchar(8) not null,
  actime DATETIME not null check( DATETIME(actime) is not null ),
  devid int not null
);

sqlite> insert into logaction values ('TEST', '2013-08-22', 1);
sqlite> insert into logaction values ('TEST', '2013-08-22 09:45:30', 1);
sqlite> insert into logaction values ('TEST', 'xyz', 2);
Error: constraint failed
sqlite>
于 2013-08-22T14:19:20.957 回答
3

不幸的是,不是真的在 sqlite - 它没有 datetime 类型 - 请参阅此处的第 1.2 节

于 2013-08-22T14:06:42.097 回答