# 42P16 — 无效表定义

> PostgreSQL SQLSTATE 42P16：来源与诊断参考。
---

# 42P16 — 无效表定义

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

`42P16`（**invalid_table_definition**）表定义可能违反分区键、排序规则或主键规则。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `42P16` |
| 条件名 | `invalid_table_definition` |
| 状态 | `有效` |
| 已知存在于 | `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_INVALID_TABLE_DEFINITION` |
| 别名 | `—` |

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

## 含义 {#meaning}

表定义检查在多种关系形状违规时使用此条件。18.6 核心示例拒绝分区键中的伪类型、支持排序规则的分区键缺少派生排序规则，以及同一表存在多个主键。

## 诊断 {#diagnosis}

根据完整消息确定表和列。检查分区键的 pg_attribute/pg_type，确认支持排序规则的类型是否有正确排序规则，并在修改 DDL 前列出现有主键约束。

## 处理 {#response}

只修改冲突的表定义：使用受支持的具体分区键类型，在源码要求时显式添加 COLLATE，或保留一个预期主键并从迁移中删除重复声明。如果 ERROR 发生在显式事务中，修正 DDL 前先 `ROLLBACK` 或回滚到错误前的保存点；不要继续向已中止的事务发送表变更。

## 消息 {#messages}

固定源码中的代表性消息包括：message: `partition key column %s has pseudo-type %s`；message: `no collation was derived for partition key column %s with collatable type %s`; HINT: `Use the COLLATE clause to set the collation explicitly.`；message: `multiple primary keys for table "%s" are not allowed`。占位符由实际对象、列或参数填充。

## 版本 {#versions}

锁定目录显示该条件最早见于 PostgreSQL 7.4；行为说明固定在 PostgreSQL 18.6 源码，目录存在范围不等于每条消息或功能都从该版本开始。

## 相关 {#related}

- [`42P07`](../42p07/)
- [`42P17`](../42p17/)

## 来源 {#sources}

源码消息、行号和证据边界见 [作者证据](../../data/evidence/42p16.json)。

- `src/backend/catalog/heap.c:576-580` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/heap.c#L576-L580))
- `src/backend/catalog/heap.c:697-702` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/heap.c#L697-L702))
- `src/backend/catalog/index.c:218-221` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/index.c#L218-L221))
