Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查约束之前未运行Postgresql BEFORE INSERT触发器_Sql_Postgresql - Fatal编程技术网

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

检查约束之前未运行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

我有一个触发器,它在insert上修剪一些数据。其中一列只能容纳20个字符。如果它有21个字符,我们就删掉第一个字符。但是,当我尝试插入21个字符时,它会响应一个错误,即该值太长。所以它看起来像是在运行触发器之前检查约束

触发器创建:

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字符?能否提供更多示例数据。