检查SQLite中的数字约束



我试图为id(长度为5位)创建一个约束,其中第5位是值的最后一位(1 x d1 + 3 x d2 + 1 x d3 + 3 x d4)。例如,如果id的前四个字符是1234,那么第五位是(1x1+3x2+1x3+3x4) = 22的最后一位,从而得到校验位d5 = 2。因此id = 12342。

这是我的代码;

CREATE TABLE GameLicense_16 (
title TEXT,
release_year INTEGER,
platform TEXT,
license_id INTEGER PRIMARY KEY
CHECK (LENGTH(license_id) == 5)
CHECK ((substr (license_id, 5, 1)) = substr (CAST ((substr (license_id, 1, 1) BETWEEN 0 AND 9) 
AS int) +
3* CAST ((substr (license_id, 2, 1) BETWEEN 0 AND 9) AS int) +
1* CAST ((substr (license_id, 3, 1) BETWEEN 0 AND 9) AS int) +
3* CAST ((substr (license_id, 4, 1) BETWEEN 0 AND 9) AS int),2,1))
);

但是当我尝试用12342的许可证id测试它时,它给了我约束失败的错误消息,这意味着计算在某个地方出错了,但我无法弄清楚。

由于您将license_id定义为INTEGER PRIMARY KEY,因此无需通过使用... BETWEEN 0 AND 9检查其每个字符来检查您插入的值是否为整数。
事实上,这是SQLite强制类型检查的唯一情况,因此您可以确定非整数值将被拒绝。

在您的代码中,您正在混合布尔表达式和substring(),这没有意义。

只关注检查约束规则,可以这样做:

CREATE TABLE GameLicense_16 (
title TEXT,
release_year INTEGER,
platform TEXT,
license_id INTEGER PRIMARY KEY
CHECK (LENGTH(license_id) == 5)
CHECK (
SUBSTR(license_id, 5, 1) + 0 = ( 
SUBSTR(license_id, 1, 1) + 3 * SUBSTR(license_id, 2, 1) +
SUBSTR(license_id, 3, 1) + 3 * SUBSTR(license_id, 4, 1)
) % 10
)  
);

最新更新