返回题库数据库刷题PostgreSQL 18 选择题 · 第 2 / 8 篇

表结构、数据类型、约束与范式

021 PostgreSQL 中 text 与 varchar(n) 的核心区别是?

难度: 基础

  • A. varchar(n) 有长度上限约束,text 没有;两者存储与性能相当
  • B. varchar 越短查询一定越快
  • C. text 只能存短字符串
  • D. varchar 固定占用声明长度
查看答案与解析

正确答案A

正确原因: text 与 varchar(n) 的主要差异是长度约束,存储实现相同。

关键边界: 无稳定上限用 text,有业务契约时用 varchar(n) 或 CHECK 约束。

错误选项辨析: varchar 不固定占用空间,性能不随长度变好,text 没有长度限制。

022 存储金额字段,比较稳妥的类型选择是?

难度: 基础

  • A. numeric 或整数最小货币单位,避免浮点误差
  • B. double precision,精度高且无误差
  • C. float,范围最大
  • D. boolean,只记录正负
查看答案与解析

正确答案A

正确原因: numeric 提供精确十进制语义,整数最小单位也精确;浮点类型存在舍入误差。

关键边界: 多币种与不同小数位需要统一精度规则,不能只靠类型。

错误选项辨析: double precision 与 float 都有二进制舍入误差,boolean 无法表示金额。

023 timestamptz 与 timestamp 的区别是?

难度: 基础

  • A. timestamptz 会改变存储的绝对时间
  • B. timestamptz 存 UTC 并按会话时区显示;timestamp 不带时区语义
  • C. timestamp 会自动转换时区
  • D. 两者完全等价,只是名字不同
查看答案与解析

正确答案B

正确原因: timestamptz 把输入转换为 UTC 存储,展示时按会话时区;timestamp 原样存储。

关键边界: 面向多时区业务优先使用 timestamptz。

错误选项辨析: timestamptz 存的是同一绝对时刻,timestamp 不做时区转换,两者语义不同。

024 用 uuid 类型而不是 varchar(36) 存 UUID,好处是?

难度: 基础

  • A. varchar 占空间更小
  • B. uuid 只占 16 字节且比较更快,索引更紧凑
  • C. uuid 无法建立索引
  • D. varchar 比较一定更快
查看答案与解析

正确答案B

正确原因: uuid 是专有 16 字节二进制类型,比 36 字符文本紧凑,比较与索引效率更高。

关键边界: 随机 UUID 做主键仍可能带来页分裂,与存储类型无关。

错误选项辨析: 文本更长,uuid 支持索引,紧凑类型比较更快。

025 jsonb 相比 json 的优势是?

难度: 进阶

  • A. json 类型查询一定更快
  • B. jsonb 保留原始文本与键顺序
  • C. 二进制存储、键去重、支持 GIN 索引与高效查询
  • D. jsonb 无法存储嵌套结构
查看答案与解析

正确答案C

正确原因: jsonb 解析为二进制格式,键去重且可建 GIN 索引,查询效率更高。

关键边界: jsonb 不保留键顺序与多余空白,需要原文时用 json。

错误选项辨析: json 是文本存储,jsonb 支持嵌套,jsonb 更快而非 json。

026 GENERATED ALWAYS AS IDENTITY 相比 SERIAL 的优势是?

难度: 进阶

  • A. IDENTITY 列不能自增
  • B. SERIAL 是标准语法而 IDENTITY 不是
  • C. 是标准 SQL 语法,权限与生成规则更清晰可控
  • D. IDENTITY 列必须手工维护值
查看答案与解析

正确答案C

正确原因: IDENTITY 是 SQL 标准特性,生成规则由列定义管理,可控制覆盖行为。

关键边界: SERIAL 本质是 int 加序列默认值,两者都会产生序列。

错误选项辨析: IDENTITY 自动生成值,是标准语法,SERIAL 是 PG 历史写法。

027 关于 CHECK 约束,正确的是?

难度: 基础

  • A. CHECK 只对 INSERT 生效,不检查 UPDATE
  • B. CHECK 约束可以引用其他表的列
  • C. 违反 CHECK 时 PostgreSQL 会静默忽略
  • D. 由数据库强制执行,比应用层校验更可靠
查看答案与解析

正确答案D

正确原因: CHECK 约束在行写入时由数据库校验,应用层校验可被绕过。

关键边界: CHECK 只能引用本表行内表达式,不能跨表。

错误选项辨析: CHECK 对 INSERT 与 UPDATE 都生效,违反会报错而非忽略。

028 PostgreSQL 中 UNIQUE 约束对 NULL 的处理是?

难度: 进阶

  • A. 只允许一个 NULL
  • B. NULL 会被当作重复值拒绝
  • C. UNIQUE 列不允许为 NULL
  • D. 允许多个 NULL 共存,NULL 不参与唯一性比较
查看答案与解析

正确答案D

正确原因: 标准语义下 NULL 表示未知,PG 的 UNIQUE 约束允许任意多个 NULL。

关键边界: 若业务要求唯一空值,需要部分唯一索引配合。

错误选项辨析: 多个 NULL 合法,NULL 不与 NULL 冲突,UNIQUE 不强制非空。

029 外键 ON DELETE 的默认行为是?

难度: 基础

  • A. NO ACTION:存在引用子行时删除父行会报错
  • B. 自动级联删除所有子行
  • C. 把子行外键置为 NULL
  • D. 把父行改为不可见
查看答案与解析

正确答案A

正确原因: 默认 NO ACTION 检查引用,未指定动作时存在子行会拒绝删除。

关键边界: CASCADE 会级联删除子行,SET NULL 要求外键列可空。

错误选项辨析: 默认不级联、不置 NULL、也不隐藏父行。

030 满足 3NF(第三范式)需要消除?

难度: 基础

  • A. 非主属性对候选键的传递依赖
  • B. 所有函数依赖,包括主键对列的依赖
  • C. 表中的全部重复数据
  • D. 主键列本身
查看答案与解析

正确答案A

正确原因: 3NF 要求非主属性不传递依赖候选键,即在 2NF 基础上消除传递依赖。

关键边界: 2NF 消除部分依赖,3NF 在其上消除传递依赖。

错误选项辨析: 函数依赖无法消除,重复数据是反范式考量,主键必须保留。

031 报表场景把冗余汇总列放进宽表,属于?

难度: 进阶

  • A. 范式设计的必要步骤
  • B. 有意的反范式设计,用空间换查询性能
  • C. 一定会导致数据错误
  • D. PostgreSQL 不允许的写法
查看答案与解析

正确答案B

正确原因: 读多写少且需要频繁聚合时,冗余列可减少 JOIN 与实时计算。

关键边界: 反范式必须配套更新策略与一致性校验,否则容易脏数据。

错误选项辨析: 反范式是设计取舍而非范式步骤,不等于必然出错,PG 完全支持。

032 生成列(GENERATED ALWAYS AS … STORED)的特点是?

难度: 进阶

  • A. 每次查询时临时计算,不占存储
  • B. 由表达式自动计算并物理存储,不能直接写入,可建索引
  • C. 可以手工覆盖任意值
  • D. 生成列不能参与索引
查看答案与解析

正确答案B

正确原因: 生成列的值由其他列推导并存储,写入时自动计算。

关键边界: 表达式必须确定性且依赖同表列,索引可用于加速查询。

错误选项辨析: 生成列是存储而非临时计算,不可手工写入,支持索引。

033 相比 text 加 CHECK,用 ENUM 类型的缺点是?

难度: 进阶

  • A. ENUM 查询一定更慢
  • B. ENUM 不能建索引
  • C. 修改枚举成员较麻烦,删除或重排成本高
  • D. ENUM 只能存数字
查看答案与解析

正确答案C

正确原因: ENUM 新增值走 ALTER TYPE,旧版本限制较多,删除成员几乎不可能。

关键边界: 值集合稳定时 ENUM 可接受,频繁演进用 text 加 CHECK 更灵活。

错误选项辨析: ENUM 支持索引且存储紧凑,是修改成本而非性能问题。

034 自增主键长期运行后推荐使用哪种整数类型?

难度: 基础

  • A. int,占用最小一定够用
  • B. smallint,最省空间
  • C. bigint,避免 int 溢出风险
  • D. boolean,只存两种状态
查看答案与解析

正确答案C

正确原因: int 上限约 21 亿,高写入表容易耗尽,bigint 提供更大空间。

关键边界: 序列本身从 1 开始递增,类型范围决定最终容量。

错误选项辨析: smallint 与 int 范围有限,boolean 不表示数值主键。

035 数组类型适合什么场景,如何加速包含查询?

难度: 进阶

  • A. 数组无法建索引
  • B. 数组只能存整数
  • C. 数组查询一定退化为全表扫描
  • D. 存储多值字段,配合 GIN 索引加速包含判断
查看答案与解析

正确答案D

正确原因: 数组天然表示多值列,GIN 索引支持 @>、&& 等包含与重叠操作。

关键边界: 数组不宜无节制嵌套,普通 B-tree 对数组用处有限。

错误选项辨析: 数组支持多种类型,可用 GIN 索引,不会必然全表扫描。

036 TOAST 机制的作用是?

难度: 进阶

  • A. 把整张表复制到内存
  • B. 加密所有数据
  • C. 为每个字段建立独立索引
  • D. 把大字段压缩或移到外部存储,减小行大小
查看答案与解析

正确答案D

正确原因: 超过阈值的大值会被压缩或外存,让行尽量保持在单页内。

关键边界: TOAST 不透明,但对超大文本与二进制字段影响明显。

错误选项辨析: TOAST 不复制表、不加密、不建索引,是存储层优化。

037 关于序列 nextval,正确的是?

难度: 基础

  • A. nextval 分配的值不会因事务回滚而回收,会产生空洞
  • B. 回滚后 nextval 的值会回退复用
  • C. 序列值保证连续无间隙
  • D. 序列只能用于主键列
查看答案与解析

正确答案A

正确原因: 序列设计为并发安全,分配即消耗,回滚不回收。

关键边界: 序列空洞是正常现象,业务不应依赖值连续。

错误选项辨析: 值不回退、不保证连续,序列也可用于非主键场景。

038 表数据量很大且按时间范围查询为主,合适的做法是?

难度: 实战

  • A. 把所有数据放一张表,靠内存硬扛
  • B. 按时间列声明式分区,查询走分区裁剪并便于按分区维护
  • C. 按业务代码分表,由应用路由
  • D. 用视图模拟分区即可
查看答案与解析

正确答案B

正确原因: 声明式分区让优化器裁剪无关分区,DROP 分区可快速清理历史数据。

关键边界: 分区键必须包含在唯一约束与高频过滤条件中。

错误选项辨析: 单表无分区规模受限,应用分表丢失数据库层优化,视图不提供物理分区能力。

039 声明式分区表与表继承(INHERITS)相比,优势是?

难度: 实战

  • A. 继承表的约束检查一定更快
  • B. 继承表支持自动路由到子表
  • C. 分区裁剪、唯一约束与约束排除都由数据库统一管理
  • D. 分区表无法做任何优化
查看答案与解析

正确答案C

正确原因: 声明式分区把路由、约束与裁剪内建到规划器,使用更安全。

关键边界: 分区表仍需正确选择分区键与维护策略。

错误选项辨析: 继承表需要手动触发器路由,分区表是内建优化而非无优化。

040 布尔列(如 is_active)适合建立普通 B-tree 索引吗?

难度: 进阶

  • A. 适合,布尔索引一定会被优化器使用
  • B. 布尔列无法建立索引
  • C. 索引能让写入更快
  • D. 选择性太低,一般收益有限,可考虑只索引目标行的部分索引
查看答案与解析

正确答案D

正确原因: 布尔列只有两种取值,过滤后仍可能返回大量行,顺序扫描通常更便宜。

关键边界: 需要快速定位少量布尔行时,用部分索引(如 WHERE is_active)更合适。

错误选项辨析: 低选择性索引不会被优先使用,布尔列可建索引,索引会增加写入成本。

官方资料

当前分类

PostgreSQL 18 选择题

查看全部分类 →
  1. 01关系模型、SQL 与数据库基础20 题
  2. 02表结构、数据类型、约束与范式20 题
  3. 03查询、连接、CTE 与窗口函数20 题
  4. 04索引结构与访问路径20 题
  5. 05事务、隔离级别、锁与死锁20 题
ESC

输入关键词开始搜索