Sqlite
SQLite, ASCII AZ 檢查約束
我有下表,我試圖將“前綴”列限制為 ASCII 字母字元。但是,在使用以下約束後,我仍然可以插入其他字元。為什麼它不起作用?
CREATE TABLE test ( id INTEGER NOT NULL PRIMARY KEY, prefix TEXT NOT NULL, CHECK(prefix NOT LIKE '%[^a-zA-Z]%') )
使用 Python 的 sqlite3 包和 SQLite 數據庫瀏覽器
LIKE
SQL 中的運算符不像正則表達式那樣工作。與強大的正則表達式相比,此運算符允許的模式匹配非常簡單。實際上,您有兩個元字元:%
means(0 or more of anything)
,它相當於正則.*
表達式中的 a ,以及 mean ,_
相當於(1 of anything)
正則表達式中的 of.
。就是這樣。這意味著您的
CHECK
條件,如最初所寫,實際上並沒有檢查您的期望。它唯一會抱怨的是這樣的陳述:INSERT INTO test VALUES (37, 'hello [a-zA-Z] impossible');
包含文字
[a-zA-Z]
。您實際上可以使用
REGEXP
運算符並編寫:CHECK (prefix REGEXP '^[a-zA-Z]+$')
但是,為了能夠使用它,您首先需要在 Linux 機器上安裝
sqlite3-pcre
sqlite3 的 pcre 正則表達式擴展(可能有 Windows 替代方案,但我找不到它)。您可以在 Stack Overflow 的如何在 SQLite 查詢中使用正則表達式?.其他數據庫(如 PostgreSQL)允許您使用
~
運算符使用 RegExp。您可以在SQLFiddle檢查它。SQLite 文件參考和教程:
LIKE 不支持字元類,但(非標準)GLOB支持:
CHECK (prefix NOT GLOB '*[^a-zA-Z]*')