Sqlite

SQLite, ASCII AZ 檢查約束

  • April 20, 2017

我有下表,我試圖將“前綴”列限制為 ASCII 字母字元。但是,在使用以下約束後,我仍然可以插入其他字元。為什麼它不起作用?

CREATE TABLE test
(
   id INTEGER NOT NULL PRIMARY KEY, 
   prefix TEXT NOT NULL, 
   CHECK(prefix NOT LIKE '%[^a-zA-Z]%')
)

使用 Python 的 sqlite3 包和 SQLite 數據庫瀏覽器

LIKESQL 中的運算符不像正則表達式那樣工作。與強大的正則表達式相比,此運算符允許的模式匹配非常簡單。實際上,您有兩個元字元%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-pcresqlite3 的 pcre 正則表達式擴展(可能有 Windows 替代方案,但我找不到它)。您可以在 Stack Overflow 的如何在 SQLite 查詢中使用正則表達式?.


其他數據庫(如 PostgreSQL)允許您使用~運算符使用 RegExp。您可以在SQLFiddle檢查它。


SQLite 文件參考和教程:

LIKE 不支持字元類,但(非標準)GLOB支持:

CHECK (prefix NOT GLOB '*[^a-zA-Z]*')

引用自:https://dba.stackexchange.com/questions/163634