z64*_*z64 3 sqlite regular-expression check-constraints regex
我有下表,我试图将列“前缀”限制为 ASCII 字母字符。但是,在使用以下约束后,我仍然可以插入其他字符。为什么它不起作用?
CREATE TABLE test
(
id INTEGER NOT NULL PRIMARY KEY,
prefix TEXT NOT NULL,
CHECK(prefix NOT LIKE '%[^a-zA-Z]%')
)
Run Code Online (Sandbox Code Playgroud)
使用 Python 的 sqlite3 包和 DB Browser for SQLite
LIKE
SQL 中的运算符不像正则表达式那样工作。与强大的正则表达式相比,此运算符允许的模式匹配非常简单。实际上,您有两个元字符:%
means (0 or more of anything)
,相当于正则.*
表达式中的a,以及_
meaning (1 of anything)
,相当于正则.
表达式中的a。就是这样。
这意味着您的CHECK
条件,如最初所写,实际上并未检查您的期望。它唯一会抱怨的是以下语句:
INSERT INTO test
VALUES (37, 'hello [a-zA-Z] impossible');
Run Code Online (Sandbox Code Playgroud)
包含文字的[a-zA-Z]
.
您实际上可以使用REGEXP
运算符并编写:
CHECK (prefix REGEXP '^[a-zA-Z]+$')
Run Code Online (Sandbox Code Playgroud)
但是,为了能够使用它,您首先需要在 Linux 机器上安装sqlite3-pcre
sqlite3的pcre regex 扩展(可能有 Windows 替代方案,但我找不到它)。您可以在 Stack Overflow 的如何在 SQLite 查询中使用正则表达式中找到更多信息和说明?.
其他数据库(如 PostgreSQL)允许您使用~
运算符使用 RegExp 。您可以在SQLFiddle进行检查。
SQLite 文档参考和教程:
归档时间: |
|
查看次数: |
3534 次 |
最近记录: |