Postgresql:违反了检查约束。失败的行包含

7
我试图使用PostgreSQL向数据库插入一些数据,但仍然显示相同的错误信息:
ERROR:违反了“ck_empleados_documento”检查约束的关系的新行 详细信息:失败的行包含(13,22222222,f,Lopez,Ana,Colon 123,1,2,casado,1990-10-10)。
我不知道错误在哪里或者是什么错误,也没有找到任何解决方法。这是我尝试插入的内容:
insert into empleados (documento, sexo, apellido, nombre, domicilio, idSecc, cantidadhijos, estadocivil, fechaingreso) values('22222222','f','Lopez','Ana','Colon 123',1,2,'casado','1990-10-10');

以下是该表的结构:

CREATE TABLE public.empleados
(
  idempleado integer NOT NULL DEFAULT nextval('empleados_idempleado_seq'::regclass),
  documento character(8),
  sexo character(1),
  apellido character varying(20),
  nombre character varying(20),
  domicilio character varying(30),
  idsecc smallint NOT NULL,
  cantidadhijos smallint,
  estadocivil character(10),
  fechaingreso date,
  CONSTRAINT pk_empleados PRIMARY KEY (idempleado),
  CONSTRAINT fk_empleados_idsecc FOREIGN KEY (idsecc)
      REFERENCES public.puestos (idpuesto) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT uq_empleados_documento UNIQUE (documento),
  CONSTRAINT ck_empleados_documento CHECK (documento ~~ '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'::text),
  CONSTRAINT ck_empleados_estadocivil CHECK (estadocivil = ANY (ARRAY['casado'::bpchar, 'divorciado'::bpchar, 'soltero'::bpchar, 'viudo'::bpchar])),
  CONSTRAINT ck_empleados_hijos CHECK (cantidadhijos >= 0),
  CONSTRAINT ck_empleados_sexo CHECK (sexo = ANY (ARRAY['f'::bpchar, 'm'::bpchar]))
)
3个回答

8
错误信息显示你的行 违反了检查约束"ck_empleados_documento"ck_empleados_documento 的定义如下:
CONSTRAINT ck_empleados_documento CHECK (documento ~~ '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'::text)

根据https://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE:

运算符~~等同于LIKE

因此,您的约束实际上意味着:
documento LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'::text

来自同一页:

stringLIKEpattern

如果pattern不包含百分号或下划线,则模式仅表示字符串本身。

您的模式不包含%_,因此相当于

documento = '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

这是不可能的,因为documento只有8个字符长。


你可能希望这样做:

documento SIMILAR TO '[0-9]{8}'

SIMILAR TO 使用 SQL 正则表达式,并理解诸如 [0-9] 的字符类。


2

我认为你的ck_empleados_documento应该这样写:

CONSTRAINT ck_empleados_documento CHECK (documento ~ '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'::text),

解释:根据Postgres文档所述:

运算符~~等同于LIKE

如果您想进行模式匹配,需要使用运算符:

~       Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive
!~  Does not match regular expression, case sensitive
!~*     Does not match regular expression, case insensitive

请注意,~不会锚定匹配,因此它将找到任何匹配的子字符串。 - melpomene

1

这篇回答是针对那些即使没有明确定义任何约束条件也会遇到此错误的人。在我的情况下,我正在使用django,我的其中一个模型有一个字段被定义为PositiveBigIntegerField,所以当某些逻辑尝试将该字段的值设置为负数时,就会发生错误。因此,请检查您的模型/表定义,确保您没有违反您不知道存在的隐含约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接