### 主键

当 设 计 数 据 表 的 时 候， 必 须 时 刻 关 注 今 后 如 何 在 表 中 定 位 数 据 大 多 数 情 况 下， 需 要 用 一 个 标 识 符 唯 一 性 地 定 位 一 行 数 据， 这 个 标 识 符 应 该 作 为 主 键 处 理。 主 键 不 必 只 包 含 单 一 的 字 段， 可 以 包 含 多 个 必 需 字 段 用 来 标 识 某 行 数 据。 如 果 需 要 用 多 个 字 段 （根 据 经 验 ： 大 于 3） 建 立 主 键， 增 加 一 个 采 用 更 加 方 便 类 型 （比 如 ： serial 或 者 bigserial） 的 字 段 作 为 主 键 可 能 是 个 好 主 意。

只 有 极 少 数 情 况 下， 主 键 才 是 无 关 紧 要 的。 这 意 味 着： 一 个 遗 失 的 主 键 强 烈 暗 示 着 这 个 数 据 表 没 有 完 全 设 计 完 毕。 这 也 是 为 什 么 Guru Hint 会 在 创 建 没 有 主 键 的 表 时 提 示 你 的 原 因。

如 果 你 查 看 PostgreSQL 的 系 统 表， 会 发 现 它 们 都 没 有 主 键， 为 什 么 会 这 样？ 实 际 上， 所 有 这 些 表 都 有 一 个 或 者 两 个 不 允 许 为 0、 能 够 被 索 引 快 速 访 问、 能 够 唯 一 标 识 每 一 行 的 字 段 （通 常 只 有 OID）， 遵 循 主 键 的 第 二 个 原 则 。 在 这 里 使 用 OID 有 历 史 性 原 因， 它 不 是 设 计 用 户 表 的 第 一 选 择 。 虽 然 有 显 式 主 键 这 种 更 新 更 合 适 的 方 式，PostgreSQL 为 了 保 持 良 好 的 向 后 兼 容 性 仍 然 使 用 旧 的 方 式。

正 如 系 统 表 的 例 子 所 示， 快 速 访 问 和 保 持 唯 一 性 的 目 标 可 以 通 过 其 他 方 式 达 到， 而 不 是 采 用 主 键。 但 是， 为 了 使 数 据 模 型 更 加 清 晰， 我 们 仍 然 强 烈 推 荐 使 用 主 键 来 达 成 这 一 目 标。