# 1. INSERT ... ON CONFLICT DO NOTHING / DO UPDATE 的 UPSERT 语义与冲突列(INFERRED INDEX)的指定方式? A 冲突目标可以任意指定列,无需匹配唯一索引 B 省略冲突目标时 DO UPDATE 无法安全引用冲突行 ✓ 正确答案 C 冲突目标必须使用约束名,不能用列名 D ON CONFLICT 只能用于 DO NOTHING
# 2. INSERT ... RETURNING 子句(PostgreSQL)的语法与典型应用,触发器、序列回填、批量插入后处理? A 只能返回 id 列 B Oracle 是唯一支持该语法的数据库 C 无法用于批量插入 D 返回的是插入后(含默认值/触发器)的行 ✓ 正确答案
# 3. INSERT ... SELECT 的锁行为,PostgreSQL 中 INSERT ... SELECT 是否对源表加锁? A 源表以快照读取,不阻塞并发写 ✓ 正确答案 B 不支持源表与目标表相同 C 会对源表加 ACCESS EXCLUSIVE 锁 D 会阻塞源表上的所有读取
# 4. INSERT ... VALUES、INSERT ... SELECT、INSERT ... DEFAULT VALUES 三种插入语法的差异? A INSERT ... DEFAULT VALUES 只能插入一行 ✓ 正确答案 B VALUES 语法不能插入多行 C 三者都不支持默认值 D INSERT ... SELECT 不能批量插入
# 5. INSERT 触发器(BEFORE/AFTER INSERT、ROW/STATEMENT)的执行时机? A 触发器不能修改插入的数据 B AFTER 触发器比 BEFORE 先执行 C STATEMENT 触发器对每行触发一次 D BEFORE ROW 触发器可以修改 NEW 的值 ✓ 正确答案
# 6. 批量 INSERT 的三种模式,多行 VALUES、COPY、INSERT ... SELECT 的性能对比? A 多行 VALUES 性能一定优于 COPY B INSERT ... SELECT 需要网络传输 C COPY 通常比普通逐行 INSERT 更快 ✓ 正确答案 D 批量插入对 WAL 无影响
# 7. 自增列在 INSERT 中的处理,DEFAULT、显式 NULL、显式值的差异? A 显式插入具体值不会影响序列 B 省略自增列会报错 C MySQL 的 AUTO_INCREMENT 对显式 NULL 会生成新值 ✓ 正确答案 D 显式 NULL 会插入 NULL
# 8. 跨方言的 INSERT 写法差异,INSERT IGNORE(MySQL)、INSERT ... ON CONFLICT(PostgreSQL)、MERGE(Oracle/SQL Server)? A PostgreSQL 使用 INSERT IGNORE B MySQL 使用 INSERT ... ON DUPLICATE KEY UPDATE ✓ 正确答案 C Oracle 使用 ON CONFLICT D 各数据库语法可完全互移植
# 9. INSERT ... RETURNING 与 CTE 联用(WITH ins AS (INSERT ... RETURNING ...) SELECT ...)的用法? A CTE 中不能使用数据修改语句 B RETURNING 的行可被主查询引用 ✓ 正确答案 C 只能在主查询中使用 SELECT D 该用法仅支持表变量
# 10. INSERT ... ON CONFLICT DO NOTHING 的副作用(不返回冲突行)? A 冲突行会通过 RETURNING 返回 B 冲突行不会返回 ✓ 正确答案 C 会更新冲突行的值 D 会抛出异常
# 11. INSERT IGNORE 在 MySQL 中的语义与潜在陷阱? A 会忽略多种可忽略错误 ✓ 正确答案 B 不会消耗 AUTO_INCREMENT C 只忽略重复键错误 D 遇到冲突会报错
# 15. ON CONFLICT (col) DO UPDATE SET ... 的语法? A EXCLUDED 表示已存在的行 B EXCLUDED 表示本次插入的候选行 ✓ 正确答案 C 不能加 WHERE 条件 D 冲突目标列必须可空
# 16. PostgreSQL 中 INSERT ... ON CONFLICT DO UPDATE 的 RETURNING 语义? A 冲突且未更新的行也会返回 B 只返回插入的行 C 不返回任何行 D 返回更新后的行 ✓ 正确答案
# 17. UPDATE ... FROM other_table 的语法(PostgreSQL)与跨表更新的实现? A 只能更新单表 B 可引用其他表的列 ✓ 正确答案 C 多行匹配时结果确定 D 仅 MySQL 支持
# 18. UPDATE ... WHERE 子查询的写法,标量子查询、IN、EXISTS 的差异? A NOT IN 在子查询含 NULL 时结果正确 B EXISTS 不受 NULL 影响 ✓ 正确答案 C 标量子查询可返回多行 D IN 与 EXISTS 完全等价
# 20. UPDATE 中引用其他列(SET col2 = col1 * 2)的求值顺序?同一 UPDATE 中能否引用被修改的列? A 基于更新后的值求值 B 按书写顺序逐步求值 C 不能引用被修改列 D 所有表达式基于原值求值 ✓ 正确答案
# 21. UPDATE 的行锁机制,MySQL InnoDB 的 X 锁、PostgreSQL 的行级锁? A 两者都阻塞读 B InnoDB 更新时加 S 锁 C PostgreSQL 读不受更新阻塞 ✓ 正确答案 D 无锁并发
# 22. UPDATE 触发器 BEFORE/AFTER 的语义差异与 OLD、NEW 引用? A OLD 表示更新后的行 B AFTER 触发器可修改 NEW C BEFORE 触发器可修改 NEW ✓ 正确答案 D NEW 表示旧值
# 23. UPDATE 语句的执行顺序,WHERE 评估 → 投影 SET 表达式 → 触发器 → 约束检查? A 先执行 AFTER 触发器再求值 B 约束检查在写入后 C WHERE 最后评估 D BEFORE 触发器在修改前执行 ✓ 正确答案
# 24. UPDATE ... FROM 中目标行被源表多行匹配时,PostgreSQL 取哪一个匹配是不确定的(非预期更新),如何用预聚合、DISTINCT ON 或子查询规避? A 会报错 B 全部合并 C 结果不确定,随机取一行 ✓ 正确答案 D 取第一行
# 25. PostgreSQL HOT(Heap-Only Tuple)更新的触发条件(更新列不含任何索引、目标页有足够空闲空间)是什么?更新索引列为何会加剧索引膨胀并阻断 HOT? A HOT 会加剧索引膨胀 B 更新索引列时会触发 HOT C HOT 与索引无关 D 更新非索引列且有空闲空间时触发 HOT ✓ 正确答案
# 28. 并发 UPDATE 同一行引发锁等待甚至死锁时,如何用 pg_locks + pg_stat_activity 定位持锁会话?分批与固定顺序更新如何降低竞争? A pg_locks 无法查看锁 B 死锁不可规避 C pg_stat_activity 可查看会话 ✓ 正确答案 D 固定顺序无法降低竞争
# 33. UPDATE ... WHERE col IN (SELECT ...) 的语义? A 子查询只能返回单行 B NOT IN 在子查询含 NULL 时可能全部失败 ✓ 正确答案 C 与 EXISTS 无差异 D 不支持子查询
# 35. UPDATE 与子查询的写法 UPDATE ... SET col = (SELECT ...)? A 可以返回多行 B 不能引用外层列 C 仅支持常量 D 子查询必须返回单值 ✓ 正确答案
# 41. DELETE 与 TRUNCATE 的根本差异,事务回滚、行级锁、触发器、空间回收? A TRUNCATE 不触发行级触发器 ✓ 正确答案 B TRUNCATE 可逐行回滚 C DELETE 立即释放空间 D 两者等价
# 42. DELETE 与外键约束的 CASCADE 行为? A SET NULL 会删除子表行 B RESTRICT 允许删除 C CASCADE 会自动删除子表行 ✓ 正确答案 D 与 DELETE 无关
# 43. DELETE 的执行机制,PostgreSQL 的 MVCC 标记 + VACUUM、MySQL InnoDB 的行删除 + undo log? A 删除后产生死元组/旧版本 ✓ 正确答案 B 无需回收 C PostgreSQL 物理立即删除 D 与 MVCC 无关
# 45. 软删除(Soft Delete)的实现模式,deleted_at 列 + 索引的取舍? A 物理删除数据 B 用 deleted_at 标记 ✓ 正确答案 C 查询无需过滤 D 无法建立索引
# 47. DELETE ... WHERE IN 子查询的陷阱? A NOT IN 含 NULL 时可能误删 ✓ 正确答案 B 无任何陷阱 C MySQL 可直接引用目标表 D 与 EXISTS 无关
# 49. DELETE 多表(DELETE t1, t2 FROM t1 JOIN t2)的 MySQL 语法? A 不支持 JOIN B 只能删除单表 C 可一次删除多表 ✓ 正确答案 D 与 TRUNCATE 等价
# 55. TRUNCATE ... RESTART IDENTITY、CASCADE 选项? A RESTART IDENTITY 重置自增 ✓ 正确答案 B 默认重置自增 C CASCADE 阻止截断 D 不能级联
# 58. TRUNCATE 是否走 MVCC? A TRUNCATE 逐行走 MVCC B 可被长事务读取旧数据 C 与 DELETE 完全一致 D TRUNCATE 不走逐行 MVCC ✓ 正确答案