# 23514 — CHECK 约束冲突（check_violation）

> PostgreSQL SQLSTATE 23514：CHECK 约束冲突的来源与诊断参考。
---

# 23514 — CHECK 约束冲突

## 速览 {#at-a-glance}

`23514` 表示 CHECK 或相关行约束计算为假。本案例中的约束名为 `amount_positive`，报文带出表、约束和失败行。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `23514` |
| 条件名 | `check_violation` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_CHECK_VIOLATION` |
| 别名 | `—` |

<!-- source facts: data/errcodes/23514.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

普通表行由执行器计算 CHECK 表达式，结果为假时报告 `23514`；CHECK 表达式为 NULL 时在 PostgreSQL 中通过，若 NULL 本身不允许，需要另加 NOT NULL。分区路由可能返回 `no partition of relation ... found for row` 及分区键 DETAIL，分区约束校验则使用分区约束报文；域校验有“values that violate the new constraint”模板，空的 `WITHOUT OVERLAPS` 值也有独立源码路径。它们使用同一 SQLSTATE，但机制和报文不同。

## 诊断 {#diagnosis}

记录约束名、表名和失败行或分区键 DETAIL，按实际类型、隐式类型转换、触发器改写和 NULL 规则重算表达式。遇到分区错误时检查分区边界及该键的路由结果；域或校验时错误则确认实际执行的是哪个模式对象规则。本案例自动提交错误后为 `IDLE`；显式事务仍须按调用边界回滚。

## 处理 {#response}

修正值或业务规则后重试。修改约束前先校验既有数据，不要为了掩盖坏数据而禁用 CHECK；分区场景应选择允许该值的分区，而不是把错误当作普通重复提交。

## 实测诊断 {#messages}

`18.6 (Homebrew) / latest`：SQLSTATE `23514`；primary `new row for relation "items" violates check constraint "amount_positive"`；DETAIL `Failing row contains (2, -1).`；status_after_error `IDLE`。
`10.21 (Debian 10.21-1.pgdg90+1) / pg10`：SQLSTATE `23514`；primary `new row for relation "items" violates check constraint "amount_positive"`；DETAIL `Failing row contains (2, -1).`；status_after_error `IDLE`。

## 代表案例 {#case}

本例第一次插入因 `amount` 为 `-1` 违反命名 CHECK；改为 `1` 即为具体修复。完整 setup、断言与清理见[案例导出](../../data/cases/23514.json)：

<!-- BEGIN SQLSTATE SNIPPET: check_constraint_insert -->
```sql
-- create
CREATE TABLE items(id integer PRIMARY KEY, amount integer CONSTRAINT amount_positive CHECK (amount > 0));
-- seed
INSERT INTO items VALUES (1, 10);
-- trigger
INSERT INTO items VALUES (2, -1);
-- repair
INSERT INTO items VALUES (2, 1);
-- verify
SELECT id, amount FROM items ORDER BY id;
```
<!-- END SQLSTATE SNIPPET -->

本案例对应的 SQLSTATE、诊断、事务状态和修复断言均来自经核对的案例 registry；见[结构化证据](../../data/evidence/23514.json)和[案例导出](../../data/cases/23514.json)。

作者证据 ID：`identity`, `row-path`, `schema-path`, `runtime`。选定运行记录：`runtime.23514-batch1-latest-20260909.latest`, `runtime.23514-batch1-pg10-20260909.pg10`。

## 版本与边界 {#versions}

锁定目录在 `7.4` 已观察到该条件，并在列出的正式快照中均存在。选定运行覆盖 18.6 与 10.21 的立即 named CHECK INSERT；未覆盖分区路由、域校验、校验时错误或 `WITHOUT OVERLAPS` 路径。固定 DDL 文档说明 CHECK 在表达式为真或 NULL 时通过，没有定义 `DEFERRABLE` CHECK 路径。

## 相关 {#related}

对比 [23502 非空约束冲突](../23502/)、[23P01 排除约束冲突](../23p01/) 和 [23505 唯一约束冲突](../23505/)。

## 来源 {#sources}

- [`src.errcodes.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt) (SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`)
- `src.calls.REL_18_6` (SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`)
- [`src.execMain.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/executor/execMain.c#L2076-L2081) (SHA-256 `33b97337fa23a649c5e7a092e1bd405a54e8503529236c62c9d5bb93a1774a8d`)
- [`src.tablecmds.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablecmds.c#L6502-L6532) (SHA-256 `422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9`)
- [`src.execPartition.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/executor/execPartition.c#L328-L335) (SHA-256 `97951428f673d4eb6dd23141817874c29640aaac0d6dc74015c993cbd0636dd6`)
- [`src.typecmds.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/typecmds.c#L3288-L3293) (SHA-256 `60d1e9754646e100f6b74aa367ad8c2c52386c400df721707423d329209c47eb`)
- [`src.execIndexing.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/executor/execIndexing.c#L1176-L1181) (SHA-256 `24c80553ab4b28d7d2a288dd9196c8db9459c7f308853cd8c8c939485e15f199`)
- [`doc.ddl-constraints.18.6`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/doc/src/sgml/ddl.sgml) (SHA-256 `ce1919d9236f2e71672660e1a347146472e966e4d19b77fde5ae345dd1db6ec7`) · [官方文档](https://www.postgresql.org/docs/18/ddl-constraints.html)
