代码之家  ›  专栏  ›  技术社区  ›  Jonathan Gómez Pérez

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

  •  6
  • Jonathan Gómez Pérez  · 技术社区  · 7 年前

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

    “ck\u empleados\u documento”详细信息:失败的行包含(1322222,

    我不知道错误在哪里或是什么,也没有找到任何解决这个问题的方法。这就是我试图插入的内容:

    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 回复  |  直到 7 年前
        1
  •  6
  •   melpomene    7 年前

    错误消息显示您的行 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 就像 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
  •  1
  •   cha    7 年前

    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