我创建了一个表,其中有日期类型的"出生日期"列。问题是我可以插入任何东西并且成功完成。我希望该字段限制插入字符串等机会,而不是相关内容。 插入 错误的结果
我已经搜索了解决方案,但我只能找到用于获取不同格式的当前时间的代码。我也不明白修饰符是如何工作的(https://www.sqlite.org/lang_datefunc.html)。
除了rowid列或rowid列的别名之外,任何类型的值都可以存储在一种类型的列中。即列的类型不限制/约束可以存储的数据。
-
p.s. 没有 DATE 类型,而是由于 SQLite 的灵活性,DATE 实际上具有 NUMERIC 的类型(类型亲和力)(这并不重要)。您可能会发现SQLite版本3中的数据类型很有趣,或者可能是这个SQLite列类型有多灵活/可追溯?
-
rowid 及其别名列必须是整数。尽管通常允许 SQLite 分配值。
在创建表 SQL 中定义列时,应以编程方式检查数据或使用CHECK约束。
CHECK 约束可以附加到列定义或指定 作为表约束。在实践中,这没有什么区别。每次 将新行插入到表中或更新现有行, 计算和强制转换与每个 CHECK 约束关联的表达式 以与 CAST 表达式相同的方式转换为数值。如果结果 为零(整数值 0 或实值 0.0),则为约束 发生了违规行为。如果 CHECK 表达式的计算结果为 NULL,或者 任何其他非零值,它不是约束冲突。这 CHECK 约束的表达式不能包含子查询。
SQLite 所理解的 SQL - 创建表
例
考虑以下代码:-
DROP TABLE IF EXISTS mychecktable ;
CREATE TABLE IF NOT EXISTS mychecktable (mycolumn BLOB CHECK(substr(mycolumn,3,1) = '-'));
INSERT INTO mychecktable VALUES('14-03-1900');
INSERT INTO mychecktable VALUES('1900-03-14'); -- ouch 3rd char not -
将产生:-
即DROP TABLE IF EXISTS mychecktable > OK > Time: 0.187s CREATE TABLE IF NOT EXISTS mychecktable (mycolumn BLOB CHECK(substr(mycolumn,3,1) = '-')) > OK > Time: 0.084s INSERT INTO mychecktable VALUES('14-03-1900') > Affected rows: 1 > Time: 0.206s INSERT INTO mychecktable VALUES('1900-03-14') > CHECK constraint failed: mychecktable > Time: 0s
- 第一次插入成功,第二次插入失败。
通常,您会在应用程序中强制使用正确的格式,但您也可以向表定义添加约束以防止这种情况,例如,
CREATE TABLE users(...,
DoB TEXT CHECK(DATE(DoB) NOT NULL AND DATE(DoB)=DoB)
)