You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL INSERT违反CHECK约束:约束定义是否有误?

问题诊断与解决

你的CK_Q_IDENTIFICACION约束确实存在错误——约束绑定的列名完全搞反了。

问题根源

你想要限制的是证件类型列I_TIPOID只能填入'CC'、'PA'、'CE'、'NI'、'OT',但约束却错误地绑定到了Q_IDENTIFICACION(身份证号码列)上:

CONSTRAINT "CK_Q_IDENTIFICACION" CHECK ("Q_IDENTIFICACION" IN ('CC', 'PA', 'CE', 'NI', 'OT'))

你插入的Q_IDENTIFICACION值是'51111111',这个身份证号显然不在约束指定的证件类型集合里,直接触发了违反约束的错误。

修复方案

方式一:修改现有表的约束

-- 删除错误约束
ALTER TABLE public."Cliente" DROP CONSTRAINT "CK_Q_IDENTIFICACION";

-- 创建正确的约束,将检查目标改为I_TIPOID列
ALTER TABLE public."Cliente"
ADD CONSTRAINT "CK_I_TIPOID" CHECK ("I_TIPOID" IN ('CC', 'PA', 'CE', 'NI', 'OT'));

方式二:重新创建表时修正约束

CREATE TABLE public."Cliente" (
    "K_CODCLIENTE" numeric(5) NOT NULL,
    "N_NOMBRE1" varchar(15) NOT NULL,
    "N_NOMBRE2" varchar(15) NOT NULL,
    "N_APELLIDO1" varchar(15) NOT NULL,
    "N_APELLIDO2" varchar(15),
    "N_DIRECCION" varchar(50) NOT NULL,
    "Q_TELEFONO" numeric(10) NOT NULL,
    "K_CODREF" numeric(5),
    "I_TIPOID" varchar(2) NOT NULL,
    "Q_IDENTIFICACION" varchar(10) NOT NULL,
    CONSTRAINT "PK_Cliente" PRIMARY KEY ("K_CODCLIENTE"),
    CONSTRAINT "UQ_ID_TIPOID_CLIENTE" UNIQUE ("I_TIPOID","Q_IDENTIFICACION"),
    CONSTRAINT "CK_CODCLIENTE" CHECK ("K_CODCLIENTE" >= 100),
    -- 修正约束的目标列
    CONSTRAINT "CK_I_TIPOID" CHECK ("I_TIPOID" IN ('CC', 'PA', 'CE', 'NI', 'OT'))
);

验证

完成约束修改后,再次执行你的INSERT语句即可正常插入数据——此时约束会检查I_TIPOID列的'CC'值是否在允许范围内,符合要求。

内容的提问来源于stack exchange,提问作者Smooth Researcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:20:30