在检查约束之前,Postgresql BEFORE INSERT触发器未运行

时间:2016-02-17 16:00:23

标签: sql postgresql

我有一个触发器正在修剪插入数据。其中一列只包含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)

1 个答案:

答案 0 :(得分:1)

Postgres在运行触发器之前不会检查 table 约束。但是,它保证NEW中字段的类型与表中字段的类型相匹配,因此在给您机会查看数据之前必须检查类型约束。

您可以通过从类型中删除大小限制来解决此问题,并将长度检查实现为表格约束:

ALTER TABLE mytable
  ALTER COLUMN mydata TYPE TEXT,
  ADD CONSTRAINT mydata_length CHECK (length(mydata) <= 20);

在内部,TEXTVARCHAR(N)在Postgres中是相同的,因此就数据库而言,类型更改不会产生任何影响。但是,某些客户端库对这些类型的处理方式有很大不同,因此请注意应用程序中性能/行为的差异。