web-dev-qa-db-ja.com

Postgresql:チェック制約に違反します。失敗した行には

Postgresqlを使用してデータベースにデータを挿入しようとしましたが、それでも同じメッセージが表示されます。

エラー:リレーション「empleados」の新しい行がチェック制約「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]))
)

エラーメッセージには、行が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

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]などの文字クラスを理解します。

6
melpomene

私はあなたの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
1
cha