我有一个触发器正在修剪插入数据。其中一列只包含20个字符。如果是21个字符,我们将删除第一个字符。但是,当我尝试插入21个字符时,它会响应一个错误,表示该值太长。所以在运行我的触发器之前它似乎是检查约束?
触发器创建:
CREATE TRIGGER my_trigger
BEFORE INSERT
ON public.mytable
FOR EACH ROW
EXECUTE PROCEDURE public.my_trigger();
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)
答案 0 :(得分:1)
Postgres在运行触发器之前不会检查 table 约束。但是,它保证NEW
中字段的类型与表中字段的类型相匹配,因此在给您机会查看数据之前必须检查类型约束。
您可以通过从类型中删除大小限制来解决此问题,并将长度检查实现为表格约束:
ALTER TABLE mytable
ALTER COLUMN mydata TYPE TEXT,
ADD CONSTRAINT mydata_length CHECK (length(mydata) <= 20);
在内部,TEXT
和VARCHAR(N)
在Postgres中是相同的,因此就数据库而言,类型更改不会产生任何影响。但是,某些客户端库对这些类型的处理方式有很大不同,因此请注意应用程序中性能/行为的差异。