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
相关产品推荐
相关产品推荐

