[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$faqqnG0H-t98R0WcrewLLT9mC7GXS2PT_Wpq1VQ3hh2s":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"1ff2b0c1-c125-4469-a09c-b8ddbc5bf705","article","AI 写 SQL 和数据库迁移，为什么必须人工确认","ai-generated-sql-database-migrations","数据库迁移会改变持久数据、锁和应用契约，语法正确不代表上线安全。本文解释 AI 生成 SQL 的风险，介绍扩展、迁移、收缩的兼容策略，以及生产执行前应检查的门槛。","让 AI 写一条查询语句很容易，真正危险的是让它修改数据库结构。增加一列看起来只是几行 SQL，实际可能锁住大表、打断旧版本服务、改变数据含义，甚至在回滚时发现旧数据已经无法恢复。数据库迁移不是“把代码翻译成 SQL”，而是对正在运行的系统进行状态变更。\n\n## 查询可以试错，迁移不能只看语法\n\n普通查询的主要问题是结果不对或速度太慢；迁移还会带来持久影响。AI 生成的 `ALTER TABLE` 可能语法正确，却没有考虑表规模、索引、默认值、锁行为和并发写入。给一张在线大表添加非空列，和在本地空数据库里执行同一条语句，风险完全不同。\n\n模型也可能根据一个不完整的 schema 做出假设：把“用户编号”当成唯一值，把时间当成本地时区，把删除理解成物理删除。只要业务语义没有写清楚，SQL 再漂亮也可能改变错误的数据。\n\n## 迁移最重要的是顺序\n\n安全的结构变更通常采用向后兼容的多步策略。以重命名字段为例，可以先增加新字段，让旧代码和新代码同时读写；再回填历史数据；发布只读取新字段的版本；确认稳定后，最后删除旧字段。每一步都可以单独验证和回滚，而不是一次性让所有服务切换。\n\n这种“扩展、迁移、收缩”的思路尤其适合由 AI 辅助，因为你可以要求模型每次只处理一个可验证阶段，并列出旧版本仍然能够工作的条件。若它直接生成一条破坏兼容性的重命名语句，往往说明任务边界还不够清楚。\n\n## 给 AI 的数据库任务应该包含哪些信息\n\n至少提供：数据库类型和版本、表结构、数据量级、读写高峰、应用的部署顺序、是否允许短暂锁表、备份与回滚策略，以及不允许改变的业务规则。不要只贴一张表定义就让模型“优化数据库”。\n\n执行前让 AI 输出三份东西：迁移 SQL、影响分析和验证步骤。影响分析要回答会锁哪些对象、是否需要全表扫描、旧代码是否仍能运行、失败时如何恢复。验证步骤应包含约束、行数、抽样数据和应用接口，而不只是“命令返回成功”。\n\n## 人工确认的最低门槛\n\n在生产执行前，人工核对四点：\n\n- 变更是否符合业务语义，而不是仅符合语法。\n- 事务边界、锁和索引是否适合真实数据量。\n- 发布顺序是否保证新旧版本短暂共存时仍可工作。\n- 备份、监控、回滚和演练是否真实存在。\n\nPostgreSQL 的官方文档把 `ALTER TABLE` 作为数据定义语言的一部分说明，这提醒我们：表结构不是普通配置，而是数据库契约。无论使用哪种数据库，执行前都应阅读对应版本的官方说明，确认默认行为而不是依赖模型记忆。\n\n## 让 AI 帮忙做“危险前的准备”\n\nAI 很适合生成只读的检查查询、解释执行计划、补充迁移测试、列出依赖表和设计回滚草案。它也适合在沙箱数据库里反复演练。真正写入生产前，保留人工批准，并让工具权限与环境分级：开发环境可自动执行，预发布环境需确认，生产环境只允许受控流水线执行。\n\nVibe Coding 可以加速数据库工作的准备阶段，却不能把责任变成自动化按钮。凡是会改变持久数据的操作，都应让“可回滚、可观察、可解释”先于“生成得很快”。\n\n## 来源\n\n- [PostgreSQL：修改表结构](https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-alter.html)\n- [GitHub Copilot CLI：工具权限控制](https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fhow-tos\u002Fcopilot-cli\u002Fuse-copilot-cli\u002Fallowing-tools)","\u002Fuploads\u002F2026-09-13\u002F6e5177d7-f51a-4722-951b-0108e9b7ecae.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse","PostgreSQL 官方文档","PostgreSQL：修改表结构","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-alter.html","published","AI 写 SQL 和数据库迁移为何必须人工确认","从数据语义、锁、兼容发布、回滚和真实数据量出发，解释 AI 生成数据库迁移为什么必须经过人工确认。",null,false,41,0,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:59.196Z",[52,60,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":49,"createdAt":59},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg",40,"2026-09-13T11:55:49.911Z",{"id":61,"type":6,"title":62,"slug":63,"summary":64,"coverUrl":65,"authorName":14,"sno":66,"publishedAt":67,"createdAt":68},"2d59f625-ead9-4cfd-b944-3d56bd9ea19a","AST：AI 为什么不只是在“读代码文本”？","ast-ai-code-understanding","AST 把源代码从一串文本变成一棵结构树，帮助编辑器、静态分析器和 AI 编程工具理解函数、变量、调用与分支之间的关系。","\u002Fuploads\u002F2026-09-14\u002F529ce69d-c781-4f61-9864-0294ae857718.jpg",42,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:25.949Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":75,"publishedAt":67,"createdAt":76},"9fba5da0-f476-4388-baca-0ccac55ae74a","CPG：把代码变成一张可以查询的关系图","code-property-graph-ai-code-analysis","代码属性图 CPG 把语法、控制流、数据流和调用关系放在同一张图中，帮助 AI Agent 理解大型代码库。","\u002Fuploads\u002F2026-09-14\u002F09363783-5faa-4365-9bde-fb995d9bbf80.jpg",44,"2026-09-14T15:01:36.014Z"]