Postgresql: нарушает ограничение проверки. Неудачная строка содержит

Я попытался вставить некоторые данные в базу данных с помощью postgresql, но все равно показывал то же сообщение:

ОШИБКА: новая строка для отношения "empleados" нарушает проверочное ограничение "ck_empleados_documento" DETAIL: ошибочная строка содержит (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]))
)

person Jonathan Gómez Pérez    schedule 28.09.2017    source источник


Ответы (2)


В сообщении об ошибке говорится, что ваша строка 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

С той же страницы:

stringLIKEpattern

Если шаблон не содержит знаков процента или подчеркивания, то шаблон представляет только саму строку.

Ваш шаблон не содержит % или _, поэтому он эквивалентен

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].

person melpomene    schedule 28.09.2017

Я думаю, что ваш 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
person cha    schedule 28.09.2017
comment
Обратите внимание, что ~ не привязывает совпадение, поэтому будет найдена любая совпадающая подстрока. - person melpomene; 28.09.2017