我创建了一个表格,其中有日期类型的“出生日期”列。问题是我可以插入任何东西,并且已成功完成。我希望该字段限制诸如插入字符串之类的机会,而不要限制相关人员。 insertions wrongResults
我一直在寻找解决方案,但是我只能找到用于获取当前时间的不同格式的代码。我也不清楚修饰符的工作原理(https://www.sqlite.org/lang_datefunc.html)。
答案 0 :(得分:1)
禁止 rowid 列或 rowid 列的别名,任何类型的值都可以存储在一种类型的列中。那是列的类型并不限制/约束可以存储的数据。
p.s。没有DATE类型,而是由于SQLite的灵活性,DATE实际上具有NUMERIC的类型(类型相似性)(没那么重要)。您可能会发现Datatypes In SQLite Version 3有趣的阅读内容,或者也许是How flexible/restricive are SQLite column types?的内容。
行标识及其列的别名必须为整数。尽管通常情况下,您允许SQLite分配值。
在CREATE TABLE SQL中定义列时,您应该以编程方式检查数据或交替使用 CHECK 约束。
CHECK约束可以附加到列定义或指定 作为表约束。实际上,这没有什么区别。每次 将新行插入表中或更新现有行, 与每个CHECK约束关联的表达式被求值并转换 以与CAST表达式相同的方式转换为NUMERIC值。如果结果 为零(整数值0或实数值0.0),然后是约束 发生违规。如果CHECK表达式的计算结果为NULL,或者 任何其他非零值,则不是违反约束。的 CHECK约束的表达式不能包含子查询。
SQL As Understood By SQLite - CREATE TABLE
考虑以下代码:-
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 -
该is将导致:-
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
答案 1 :(得分:0)
通常,您将在应用程序中强制使用正确的格式,但是您也可以在表定义中添加约束以防止这种情况,例如
CREATE TABLE users(...,
DoB TEXT CHECK(DATE(DoB) NOT NULL AND DATE(DoB)=DoB)
)