使用char

问题描述

我当前正在使用sqlite Studio,并且无法在char类型的列上添加检查约束。该列是长度为5的字符的唯一代码的列表。我希望检查约束在代码中的任何位置都不包括字母S,I和Z。这是我到目前为止编写的代码

CHECK(length(VIN)= 5)AND substr(VIN,1,5)NOT IN('S','I','Z')

上面的代码什么都不做,字母仍然可以包含在代码中,所以我决定做相反的事情,虽然时间更长一点。

(length(VIN)= 5)AND substr(VIN,1,5)IN('A','B','C','D','E','F','G', 'H','J','K','L','M','N','O','P','Q','R','T','U','V ','W','X','Y')

在上面的代码中,检查约束起作用,但是约束不允许插入5个长度的代码在这个问题上的任何帮助将是巨大的。预先感谢

解决方法

substr(VIN,1,5) NOT IN ('S','I','Z')将始终为true,因为您正在检查5个字符长的字符串是否不等于1个字符长的字符串,这种情况总是如此。您需要GLOB匹配项:

sqlite> CREATE TABLE example(vin TEXT CHECK (length(vin) = 5 AND vin NOT GLOB '*[sSiIzZ]*'));
sqlite> INSERT INTO example(vin) VALUES ('aaaaaa'); -- Too long
Error: CHECK constraint failed: example
sqlite> INSERT INTO example(vin) VALUES ('aaaaa'); -- Just right
sqlite> INSERT INTO example(vin) VALUES ('aaaza'); -- Forbidden character
Error: CHECK constraint failed: example