20261020_articles_to_dan_knowledge.sql 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. -- ============================================================================
  2. -- 迁移: 809 篇菌群文章 合并入 dan_knowledge_base
  3. -- 日期: 2026-10-20
  4. -- 目的: 知识库统一。将 health_knowledge_base 中 809 篇菌群文章(item_type='article')
  5. -- 迁入 dan_knowledge_base,以 source_type='article' 与既有 39 条 file 知识区分,
  6. -- 最终 dan_knowledge_base 共 848 条(39 file + 809 article)。
  7. -- 数据来源: health_knowledge_base(仅含 item_type='article' 的 809 行,
  8. -- 已确认无空标题、无其他 item_type)
  9. -- 映射关系:
  10. -- dan_knowledge_base.title <- health_knowledge_base.item_name
  11. -- dan_knowledge_base.content <- health_knowledge_base.description
  12. -- dan_knowledge_base.sort <- 0
  13. -- dan_knowledge_base.status <- 1 (启用)
  14. -- dan_knowledge_base.source_url <- health_knowledge_base.source
  15. -- dan_knowledge_base.source_type <- 'article'
  16. -- dan_knowledge_base.created_at <- health_knowledge_base.created_at (保留原始时间戳)
  17. -- dan_knowledge_base.updated_at <- health_knowledge_base.updated_at (保留原始时间戳)
  18. --
  19. -- 说明: 本脚本幂等、可重复执行。幂等策略采用「先删再插」:
  20. -- dan_knowledge_base.source_type='article' 是本脚本专用标记(既有 39 条案例为 'file',
  21. -- langgraph/管理端均不产生 article 行),重跑时先 DELETE 再 INSERT,
  22. -- 结果恒为 39 file + 809 article(共 848 条),不会重复插入。
  23. -- 时序约束: 本脚本须在「步骤7 清理 health_knowledge_base 的 article」之前执行/重跑;
  24. -- 若 health_knowledge_base 已清空(item_type='article' 为 0),勿重跑本脚本——
  25. -- 此时数据已在 dan_knowledge_base,重跑会把 article 删空且无法补回,须用备份表恢复。
  26. -- 回滚: DELETE FROM dan_knowledge_base WHERE source_type='article';
  27. -- ============================================================================
  28. -- ----------------------------------------------------------------------------
  29. -- 0. 备份(部署前必做)
  30. -- ----------------------------------------------------------------------------
  31. DROP TABLE IF EXISTS dan_knowledge_base_bak_20261020;
  32. CREATE TABLE dan_knowledge_base_bak_20261020 LIKE dan_knowledge_base;
  33. INSERT INTO dan_knowledge_base_bak_20261020 SELECT * FROM dan_knowledge_base;
  34. DROP TABLE IF EXISTS health_knowledge_base_bak_20261020;
  35. CREATE TABLE health_knowledge_base_bak_20261020 LIKE health_knowledge_base;
  36. INSERT INTO health_knowledge_base_bak_20261020 SELECT * FROM health_knowledge_base;
  37. -- 校验备份: 期望 dan_knowledge_base_bak_20261020 = 39, health_knowledge_base_bak_20261020 = 809
  38. SELECT (SELECT COUNT(*) FROM dan_knowledge_base_bak_20261020) AS dan_bak_rows,
  39. (SELECT COUNT(*) FROM health_knowledge_base_bak_20261020) AS health_bak_rows;
  40. -- ----------------------------------------------------------------------------
  41. -- 1. 幂等 INSERT 809 篇(先删再插,source_type='article' 为本脚本专用标记)
  42. -- 重跑场景:删除本脚本前次插入的行,再重新从 health_knowledge_base 拉取。
  43. -- 若 health_knowledge_base 已清理(步骤7之后),此步将清空 dan_knowledge_base 的 article;
  44. -- 参见头部注释关于时序约束的说明。
  45. -- ----------------------------------------------------------------------------
  46. DELETE FROM dan_knowledge_base WHERE source_type = 'article';
  47. INSERT INTO dan_knowledge_base (title, content, sort, status, source_url, source_type, created_at, updated_at)
  48. SELECT item_name, description, 0, 1, source, 'article', created_at, updated_at
  49. FROM health_knowledge_base
  50. WHERE item_type = 'article';
  51. -- 期望: DELETE 影响 ~809 行(首次为 0),INSERT 影响 809 行;合计净增 809 条
  52. -- ----------------------------------------------------------------------------
  53. -- 2. 校验
  54. -- ----------------------------------------------------------------------------
  55. -- 2.1 按 source_type 分组计数: 期望 file=39, article=809
  56. SELECT source_type, COUNT(*) FROM dan_knowledge_base GROUP BY source_type;
  57. -- 2.2 总数: 期望 848
  58. SELECT COUNT(*) AS total FROM dan_knowledge_base;
  59. -- 2.3 时间戳保留: 期望与 health_knowledge_base 原始时间一致(非迁移当天 2026-10-20)
  60. SELECT MIN(created_at), MAX(created_at) FROM dan_knowledge_base WHERE source_type='article';
  61. SELECT MIN(created_at), MAX(created_at) FROM health_knowledge_base WHERE item_type='article';
  62. -- 2.4 空标题检查: 期望 0
  63. SELECT COUNT(*) FROM dan_knowledge_base
  64. WHERE source_type='article' AND (title IS NULL OR TRIM(title)='');
  65. -- 2.5 空内容检查: 期望 0(注意 AND/OR 优先级,需加括号)
  66. SELECT COUNT(*) FROM dan_knowledge_base
  67. WHERE source_type='article' AND (content IS NULL OR TRIM(content)='');
  68. -- ----------------------------------------------------------------------------
  69. -- 3. 回滚
  70. -- ----------------------------------------------------------------------------
  71. -- DELETE FROM dan_knowledge_base WHERE source_type='article';