检查约束之前未运行Postgresql BEFORE INSERT触发器
我有一个触发器,它在insert上修剪一些数据。其中一列只能容纳20个字符。如果它有21个字符,我们就删掉第一个字符。但是,当我尝试插入21个字符时,它会响应一个错误,即该值太长。所以它看起来像是在运行触发器之前检查约束 触发器创建:检查约束之前未运行Postgresql BEFORE INSERT触发器,sql,postgresql,Sql,Postgresql,我有一个触发器,它在insert上修剪一些数据。其中一列只能容纳20个字符。如果它有21个字符,我们就删掉第一个字符。但是,当我尝试插入21个字符时,它会响应一个错误,即该值太长。所以它看起来像是在运行触发器之前检查约束 触发器创建: CREATE TRIGGER my_trigger BEFORE INSERT ON public.mytable FOR EACH ROW EXECUTE PROCEDURE public.my_trigger(); 触发器中有如下代码: IF
CREATE TRIGGER my_trigger
BEFORE INSERT
ON public.mytable
FOR EACH ROW
EXECUTE PROCEDURE public.my_trigger();
触发器中有如下代码:
IF (NEW.mydata IS NOT NULL AND LENGTH(NEW.mydata) > 20 THEN
NEW.mydata := substring(NEW.mydata from 2);
END IF;
但是,当我尝试插入并在其中插入21个字符时,它将失败:
[Err]错误:值太长,无法更改类型字符(20)
Postgres在运行触发器之前不会检查表约束。但是,它保证NEW
中的字段类型与表中的字段类型匹配,因此它必须检查类型约束,然后才有机会查看数据
您可以通过从类型中删除大小限制,并将长度检查改为表约束来解决此问题:
ALTER TABLE mytable
ALTER COLUMN mydata TYPE TEXT,
ADD CONSTRAINT mydata_length CHECK (length(mydata) <= 20);
altertablemytable
ALTER列mydata类型TEXT,
添加约束mydata\u长度检查(长度(mydata))是否尝试插入unicode字符?能否提供更多示例数据。