Postgresql
使用正則表達式的約束檢查值
在帶有欄位的表中
code
,我想授權使用者從列表中選擇一個值。以下是列表值的範例:
A|AG|AL|AS|B|C|D|DA
我添加了這樣的約束
code
:ALTER TABLE mytable ADD CONSTRAINT verif_code CHECK (code::text ~ '(A|AG|AL|AS|B|C|D|DA)')
儘管如此,我可以在列表中選擇第一個之後添加一個額外的值。
ALY accepted -> :( Y rejected -> :)
如何避免在第二個位置添加一個不在列表中的值的可能性?
(我可以使用
IN
運算符,但最後,授權值code
將是三組列表的組合。)
該值與條件匹配,因為它包含
A
.正則表達式不僅理解起來很複雜,而且處理起來也很昂貴(這兩者之間存在聯繫)。所以,如果你可以沒有它們,那就去做吧。
在這種情況下,檢查約束應該是
ALTER TABLE mytable ADD CONSTRAINT verif_code CHECK (code IN ('A', 'AG', 'AL', 'AS', 'B', 'C', 'D', 'DA'));
類似於ypercubeᵀᴹ 的建議:
如果我理解正確,它可能可以用一個複雜的正則表達式來解決,例如
CHECK (code SIMILAR TO '(A|AG|AL|AS|B|C|D|DA)(1|2|3|4)(X|Y|Z)')
一個由 3 個部分組成的程式碼,第一個部分如問題中所述,第二部分是從 1 到 4 的數字和字元的第三部分, X、Y 或 Z。此表達式按預期工作:
code SIMILAR TO ('(A|AG|AL|AS|B|C|D|DA|DL|DS|G|GA)(d|h|l|m)?(_lab|_g|_h|_o)?')
第一個列表的一個元素後跟或不跟隨第二個列表的一個元素,後跟或不跟隨第三個列表的一個元素。
例如:廣告;AG_g ; DSh_lab。