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

时间:2017-09-28 03:06:53

标签: sql postgresql pgadmin check-constraints

我尝试使用postgresql在数据库中插入一些数据,但仍显示相同的消息:

  

错误:关系“empleados”的新行违反了检查约束   “ck_empleados_documento”详细信息:失败的行包含(13,222222222,   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]))
)

2 个答案:

答案 0 :(得分:5)

错误消息显示您的行violates check constraint "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

从同一页面:

  

string LIKE pattern

  

如果 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]等字符类。

答案 1 :(得分:1)

我认为你的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 Documentation

  

运营商~~相当于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