【问题标题】:SQLite check constraint using char使用 char 的 SQLite 检查约束
【发布时间】:2020-10-16 15:10:23
【问题描述】:

我目前正在使用 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 个长度的代码。在这个问题上的任何帮助都会很棒。提前致谢

【问题讨论】:

    标签: java sqlite char check-constraints


    【解决方案1】:

    substr(VIN, 1, 5) NOT IN ('S','I','Z') 将始终为真,因为您正在检查 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多