布尔与位串类型与约束体系(CHECK、外键、排他约束)

共 23 题
#

1. PostgreSQL 原生 boolean(true/false/NULL 三值)与 MySQL 用 TINYINT(1) 模拟布尔在存储、比较语义与驱动映射(JDBC tinyInt1isBit)上有何差异与迁移陷阱?

A 排序
B 字符集
C 时区
D TINYINT(1) 是否映射为 Java boolean ✓ 正确答案
#

2. 为什么布尔列只有两三个取值、直接建普通 B-Tree 索引通常无意义(选择性过低)?如何用部分索引(WHERE flag = true)或位图类扫描替代?

A 全表索引
B 部分索引 ✓ 正确答案
C 无索引
D 全文索引
#

3. 布尔表达式与三值逻辑如何组合(true AND unknown = unknown、false AND unknown = false、true OR unknown = true)?这对 WHERE 过滤与 CHECK 约束有何影响?

A 违反约束
B 报错
C 视为通过 ✓ 正确答案
D 不确定
#

4. bit/varbit 位串类型的存储方式与位操作符(&、|、#、<<、>>、bit_count)有哪些?权限位掩码、特性开关(feature flags)场景如何建模?

A & ✓ 正确答案
B |
C #
D <<
#

5. MySQL 的 BIT(64) 与 TINYINT(1) 有何区别?为什么 JDBC/客户端读取 BIT 列常得到二进制字面量(b'...')或乱码,如何正确转换?

A 无需转换
B LENGTH(col)
C CHAR(col)
D CAST(col AS UNSIGNED) ✓ 正确答案
#

6. ORM 中布尔映射的常见坑(MySQL 存 0/1 而 PG 存 true/false、Java Boolean 包装类与数据库 NULL、Hibernate 方言差异)有哪些?

A 方言不同 ✓ 正确答案
B 字符集
C 时区
D 索引
#

7. 复合唯一约束中 NULL 的语义差异(MySQL 允许多个 NULL 与 SQL Server 只允许一个)及空值业务键的处理

A 禁止 NULL
B 只允许一个 NULL
C 允许多个 NULL ✓ 正确答案
D NULL 视为相等
#

8. 布尔与整数互转(ALTER COLUMN ... USING col::boolean)时哪些值转为 true/false?空字符串转换为何报错?

A 转为 false
B 转为 true
C 转为 NULL
D 报错 ✓ 正确答案
#

9. BOOL_AND/BOOL_OR 聚合如何实现“全部满足/任一满足”判定?空集与全 NULL 输入的结果是什么?

A false
B true ✓ 正确答案
C NULL
D 报错
#

10. 低选择性布尔列参与复合索引时应放在前面还是后面?与部分索引、覆盖索引如何配合?

A 全文索引
B 全表复合索引最左
C 无索引
D 部分索引 ✓ 正确答案
#

11. 外键参照动作 NO ACTION 与 RESTRICT 的本质区别是什么(NO ACTION 可在 DEFERRABLE 约束下推迟到事务末尾检查)?CASCADE/SET NULL/SET DEFAULT 各自适用与风险?

A 完全相同
B RESTRICT 可推迟
C NO ACTION 可在 DEFERRABLE 下推迟检查 ✓ 正确答案
D NO ACTION 不检查
#

12. PostgreSQL 如何用 ALTER TABLE ADD CONSTRAINT ... NOT VALID 再 VALIDATE CONSTRAINT 为大表在线添加外键/CHECK?两阶段分别持有什么锁、为何能避免长锁?

A ROW EXCLUSIVE
B ACCESS EXCLUSIVE
C SHARE UPDATE EXCLUSIVE ✓ 正确答案
D 无锁
#

13. 排他约束 EXCLUDE USING gist (room_id WITH =, period WITH &&) 如何实现“会议室时段不重叠”?为什么需要 btree_gist 扩展把等值操作纳入 GiST?

A pg_trgm
B postgis
C hstore
D btree_gist ✓ 正确答案
#

14. 为什么 CHECK 约束只能引用本行列、不能引用其他表或子查询?跨行/跨表完整性(如账户借贷合计为零)有哪些替代手段(约束触发器、排他约束、应用层)?

A CHECK 约束
B 约束触发器或应用层校验 ✓ 正确答案
C NOT NULL
D 唯一约束
#

15. PostgreSQL 为什么不自动为外键列创建索引?外键列缺索引时,父表 DELETE/UPDATE 为何会引发子表全表扫描与锁排队(甚至死锁)?

A 直接删除
B 全表扫描子表检查引用 ✓ 正确答案
C 报错
D 无影响
#

16. CHECK 约束如何处理 NULL(CHECK (col > 0) 在 col 为 NULL 时视为通过而非违例)?需要禁止空值时应如何配合 NOT NULL?

A 加 PRIMARY KEY
B 加 UNIQUE
C 加 NOT NULL ✓ 正确答案
D 无需处理
#

17. 约束触发器(CONSTRAINT TRIGGER,可 DEFERRABLE)与普通触发器、CHECK 约束在复杂校验逻辑上的取舍是什么?

A CHECK 约束
B 普通触发器
C 约束触发器(DEFERRABLE) ✓ 正确答案
D 唯一约束
#

18. 排他约束在并发插入重叠区间时的锁与冲突行为,及与 NOWAIT 的配合

A 立即成功
B 阻塞等待直到前事务提交/回滚 ✓ 正确答案
C 静默忽略
D 覆盖前事务
#

19. 外键与分区表有哪些限制(PostgreSQL 12+ 才支持分区表作为被引用端、跨分区更新的外键行为,MySQL 分区表不支持外键)?

A MySQL 分区表不支持外键 ✓ 正确答案
B 所有数据库都支持
C PG 所有版本都支持
D 无限制
#

20. MySQL 8.0.16 起才真正强制执行 CHECK 约束,之前版本为何被静默忽略?与 PostgreSQL 的报错行为有何差异?

A 自动修复
B 强制执行
C 报错
D 被静默忽略 ✓ 正确答案
#

21. ON DELETE SET DEFAULT 在默认值缺失或违反其他约束时会怎样?约束检查的报错顺序如何?

A 置 NULL
B 删除报错 ✓ 正确答案
C 忽略
D 级联删除
#

22. 为大表添加外键前,如何先查出违反引用的“孤儿数据”(LEFT JOIN ... IS NULL / NOT EXISTS)并清理?

A FULL JOIN
B LEFT JOIN ... IS NULL ✓ 正确答案
C INNER JOIN
D CROSS JOIN
#

23. BIT 类型与字节数组的转换(get_bit/set_bit、bit 与 bytea 互转)

A length
B set_bit
C bit_count
D get_bit ✓ 正确答案