写入与 RETURNING

共 58 题
#

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 遇到冲突会报错
#

12. INSERT INTO ... SELECT FROM 的源表与目标表能否是同一张表?

A 允许,基于快照读取源行 ✓ 正确答案
B 会无限循环
C 会丢弃所有行
D 不允许,会报错
#

13. INSERT 时的自动提交(AUTOCOMMIT)行为?

A 批量插入时无需关闭
B 开启后可以回滚
C 与事务无关
D 开启后每条 INSERT 立即提交 ✓ 正确答案
#

14. MySQL 中 INSERT DELAYED 的现代替代?

A 在 MySQL 8.0 仍可用
B 是推荐的批量方案
C 已被弃用并移除 ✓ 正确答案
D 与 InnoDB 完全兼容
#

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 完全等价
#

19. UPDATE 与 LIMIT(MySQL)的分批更新?

A 受 ORDER BY 影响
B 一次更新 n 行 ✓ 正确答案
C 会锁全表
D 仅支持单行
#

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 ✓ 正确答案
#

26. UPDATE 与索引,WHERE 条件未命中索引时的全表扫描与行锁开销?

A 不会全表扫描
B 无锁开销
C 只锁一行
D 会全表扫描定位行 ✓ 正确答案
#

27. 大批量 UPDATE 的事务边界,分批提交减少回滚段压力?

A 单事务更好
B 分批可降低回滚段压力 ✓ 正确答案
C 分批会丢失原子性
D 分批无需幂等
#

28. 并发 UPDATE 同一行引发锁等待甚至死锁时,如何用 pg_locks + pg_stat_activity 定位持锁会话?分批与固定顺序更新如何降低竞争?

A pg_locks 无法查看锁
B 死锁不可规避
C pg_stat_activity 可查看会话 ✓ 正确答案
D 固定顺序无法降低竞争
#

29. MySQL 多表 UPDATE 的语法?

A 用 JOIN 连接多表 ✓ 正确答案
B 只支持单表
C 不允许 SET 跨表
D 与 DELETE 无关
#

30. UPDATE ... ORDER BY 的方言支持?

A MySQL 支持 ✓ 正确答案
B PostgreSQL 原生支持
C 所有数据库都支持
D 用于控制插入顺序
#

31. UPDATE ... RETURNING 的用法?

A 返回更新后的行 ✓ 正确答案
B 仅 MySQL 支持
C 返回更新前的行
D 无返回值
#

32. UPDATE ... WHERE CURRENT OF 游标的用法?

A 更新游标当前行 ✓ 正确答案
B 无需事务
C 需与 DELETE 配合
D 只能插入
#

33. UPDATE ... WHERE col IN (SELECT ...) 的语义?

A 子查询只能返回单行
B NOT IN 在子查询含 NULL 时可能全部失败 ✓ 正确答案
C 与 EXISTS 无差异
D 不支持子查询
#

34. UPDATE 与 REPLACE(MySQL)的差异?

A REPLACE 是删除+插入 ✓ 正确答案
B UPDATE 是删除+插入
C 两者等价
D REPLACE 不触发触发器
#

35. UPDATE 与子查询的写法 UPDATE ... SET col = (SELECT ...)?

A 可以返回多行
B 不能引用外层列
C 仅支持常量
D 子查询必须返回单值 ✓ 正确答案
#

36. UPDATE 多列的语法 SET col1=1, col2=2?

A 用逗号分隔多列 ✓ 正确答案
B 只能更新一列
C 非原子
D 用分号分隔
#

37. UPDATE 的并发写竞争(Lost Update)?

A 与并发无关
B 单条 UPDATE 不会丢失
C 无法规避
D 应用层读-改-写可能丢失 ✓ 正确答案
#

38. UPDATE 的影响行数(ROW_COUNT)?

A 所有数据库一致
B 与行数无关
C MySQL 默认不计数未变化行 ✓ 正确答案
D 总是返回匹配行数
#

39. DELETE ... RETURNING 的应用,删除并返回被删数据(归档场景)?

A 返回剩余行
B 仅 MySQL 支持
C 返回被删行 ✓ 正确答案
D 无返回值
#

40. DELETE 与 LIMIT(MySQL)的分批删除?

A 必须带 ORDER BY
B 一次删除 n 行 ✓ 正确答案
C 不能在 MySQL 使用
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 无关
#

44. DELETE 触发器 BEFORE/AFTER 的执行顺序与 OLD 引用?

A 有 NEW 引用
B OLD 表示剩余行
C BEFORE 可阻止删除 ✓ 正确答案
D 无触发器
#

45. 软删除(Soft Delete)的实现模式,deleted_at 列 + 索引的取舍?

A 物理删除数据
B 用 deleted_at 标记 ✓ 正确答案
C 查询无需过滤
D 无法建立索引
#

46. DELETE 后的死元组(Dead Tuples)对查询性能的影响?VACUUM 何时回收?

A 不影响性能
B 会导致索引膨胀 ✓ 正确答案
C VACUUM 不回收
D 无需管理
#

47. DELETE ... WHERE IN 子查询的陷阱?

A NOT IN 含 NULL 时可能误删 ✓ 正确答案
B 无任何陷阱
C MySQL 可直接引用目标表
D 与 EXISTS 无关
#

48. DELETE 与 GDPR / 数据删除请求的处理?

A 只需删除主表
B 软删除必然满足要求
C 与备份无关
D 需级联删除关联数据 ✓ 正确答案
#

49. DELETE 多表(DELETE t1, t2 FROM t1 JOIN t2)的 MySQL 语法?

A 不支持 JOIN
B 只能删除单表
C 可一次删除多表 ✓ 正确答案
D 与 TRUNCATE 等价
#

50. PostgreSQL 中 USING 子句的 DELETE?

A 仅用于插入
B 与 MySQL 无关
C 可基于其他表删除 ✓ 正确答案
D 不能删除行
#

51. 批量删除的最佳实践(分批、LIMIT、循环)?

A 应单事务一次删除
B 无需索引
C 分批删除降低锁压力 ✓ 正确答案
D 分批会丢失一致性
#

52. 逻辑删除(deleted=1)的查询过滤?

A 查询无需过滤
B 不能建索引
C 需过滤 deleted 标志 ✓ 正确答案
D 与软删除无关
#

53. TRUNCATE 的实现,扫描数据页 + 重置自增、序列的行为?

A 重置自增 ✓ 正确答案
B 逐行删除
C 不改变序列
D 速度比 DELETE 慢
#

54. 归档表(Archive Table)的分区方案,时间分区、冷热分离?

A 分区无法删除
B 与查询无关
C 冷热数据不分离
D 按时间分区便于清理 ✓ 正确答案
#

55. TRUNCATE ... RESTART IDENTITY、CASCADE 选项?

A RESTART IDENTITY 重置自增 ✓ 正确答案
B 默认重置自增
C CASCADE 阻止截断
D 不能级联
#

56. INSERT 与序列的空洞产生?

A 序列不保证连续 ✓ 正确答案
B 序列保证连续
C 空洞可避免
D 回滚会回收序列值
#

57. DELETE 是否释放磁盘空间?

A 立即释放磁盘空间
B 不立即释放,需回收 ✓ 正确答案
C 与 TRUNCATE 相同
D 永不释放
#

58. TRUNCATE 是否走 MVCC?

A TRUNCATE 逐行走 MVCC
B 可被长事务读取旧数据
C 与 DELETE 完全一致
D TRUNCATE 不走逐行 MVCC ✓ 正确答案