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
同じページから:
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]
などの文字クラスを理解します。
私はあなたの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