Postgresql

使用 postgresql 中的檢查約束驗證列是否包含字元

  • April 28, 2022

桌子:

create table tempchkconstraint ( 
 colcode varchar, 
 colname varchar, 
 lastmoddate timestamp without time zone 
);

如果任何帶有字元“-”的數據試圖插入/更新添加約束,則需要驗證“colcode”列:

alter TABLE tempchkconstraint 
 add constraint chk_tempchkconstraint_code 
 check (colcode NOT ILIKE '%-%') ;

約束正在起作用。還有其他更好的方法嗎?

這個條件應該是等價的,但更快:

strpos(colcode, '-') = 0

這就是您要確保沒有包含“-”字元的字元串的方法。為了完成,另一種方法是通過正則表達式檢查:

CHECK (colcode !~ '.*-.*')

這對於單字元檢查來說是多餘的,但允許更複雜的檢查。

此外,如果應用程序嘗試插入包含“-”的字元串,約束將向應用程序拋出錯誤,但是,如果您只想過濾掉斜杠,則可以使用觸發器來執行此操作:

CREATE FUNCTION replace_slash() RETURNS trigger AS $replace_slash$
   BEGIN
       IF NEW.colcode ILIKE '%-%' THEN
           NEW.colcode = replace(NEW.colcode,'-','');
       END IF;
       RETURN NEW;
   END;
$replace_slash$ LANGUAGE plpgsql;

CREATE TRIGGER no_slashes
BEFORE INSERT OR UPDATE OF colcode
ON tempchkconstraint
FOR EACH ROW
EXECUTE FUNCTION replace_slash();

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