可以强制使用SQLite数据类型吗?

qkf9rpyu  于 2022-11-14  发布在  SQLite
关注(0)|答案(3)|浏览(160)

据我所知,SQLite的数据类型与其列无关,而与数据本身相关:这实际上意味着您可以向任何列插入任何数据。
有没有可能禁止这种行为?我的意思是,例如,当我不小心尝试将文本插入到整数时,我希望SQLite引发一个错误(或至少一个警告)。

p5cysglq

p5cysglq1#

您可以使用CHECK约束和typeof()来检查实际数据类型:

CREATE TABLE MyTable (
    Col1 INTEGER  CHECK (typeof(Col1) = 'integer'),
    Col2 TEXT     CHECK (typeof(Col2) IN ('text', 'null')
);
q9yhzks0

q9yhzks02#

我相信你可以使用CHECK约束。

CREATE TABLE testinsert (
    COL1 INTEGER, 
    COL2 INTEGER CHECK (CAST(COL2||1 AS INTEGER) <> 0) -- column constraint
    CHECK (CAST(COL1||1 AS INTEGER) <> 0) -- table constraint
);
  • 这将创建一个包含COL1和COL2两列的表。
  • 两列具有相同的约束,但应用于列的方式不同
  • COL1将CHECK约束作为表约束应用
  • COL2将CHECK约束作为列约束应用
  • 约束的工作方式是在强制转换为整数时检查列的值。如果值不是整数,则结果为0(FALSE)。但是,为了满足0作为有效值1的要求,需要将其连接到列的值。因此,0将导致1。

您还可以使用**TYPEOF**函数,例如

COL3 INTEGER CHECK(typeof(COL3) = 'INTEGER')
  • 请注意,使用cast和typeof之间有细微的区别。前面的示例使用CAST将允许以字符串形式提供整数,而使用typeof函数将只允许提供整数。

以下是一些带有结果的示例插入:-

INSERT INTO testinsert VALUES(100,100); -- OK
INSERT INTO testinsert VALUES('100',100); -- OK
INSERT INTO testinsert VALUES('100','abc'); -- ouch for COL2 (abc)
INSERT INTO testinsert VALUES(0,100); -- OK
INSERT INTO testinsert VALUES('0',100); -- OK
INSERT INTO testinsert VALUES('abc',100); -- ouch  for COL1 (abc)

随着第三次全国人大常委会会议的增加:

INSERT INTO testinsert VALUES(100,100,100); -- OK (all integers)
INSERT INTO testinsert VALUES('100','100',100); -- OK (CAST can accept integers as strings)
INSERT INTO testinsert VALUES('100','100','100'); -- Ouch typeof will consider '100' as a string, not an integer

如果您希望忽略而不是中止(默认设置),则可以使用:-

INSERT OR IGNORE INTO testinsert VALUES('100','abc'); -- insert Skipped - no fail

使用SQLite管理器对上述内容进行了测试。
以下是冲突失败的一个例子:

SQLiteManager:  -- OK
INSERT INTO testinsert VALUES('100','abc'); [ CHECK constraint failed: testinsert ]
Exception Name: NS_ERROR_STORAGE_CONSTRAINT
Exception Message: Component returned failure code: 0x80630003 (NS_ERROR_STORAGE_CONSTRAINT) [mozIStorageStatement.execute]

你不妨看看:-

mspsb9vt

mspsb9vt3#

从SQLite版本3.37.0开始,可以强制使用STRICT Tables进行数据类型检查:
在CREATE TABLE语句中,如果在结束符“)”之后添加了“Strong”TABLE-OPTION关键字,则严格的类型规则将应用于该表。
您可以将以下数据类型之一用于列定义:

  • 整型
  • 整型
  • REAL
  • 文本
  • BLOB
  • 任何

请参阅简化的demo

相关问题