Claude Code 乱猜字段名 我给它写了一个数据库查询约束 Skill

时间:2026-07-02 09:24:51 来源:互联网

在尝试通过Claude Code查询保单表时,AI频繁因猜测字段名而导致SQL执行报错,这一问题暴露了数据库查询场景中的核心痛点:人工智能缺乏主动验证表结构的意识。

被 Claude Code 气到的一天

事情是这样的。

Claude Code 乱猜字段名?我给它写了一个"数据库查询约束 Skill"

我尝试通过Claude Code查询某张保单表的退保记录,目标锁定在最近一个月的数据。下达的指令非常简洁。

Claude响应迅速,立即生成了一段SQL语句。

SELECT id, policy_no, created_at, surrender_amount, status FROM policy_surrender WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY);

初看似乎没什么问题。

然而执行结果却直接报错。

问题在于created_at字段根本不存在。这张表记录创建时间的字段实际名为create_time

我立即纠正道:"字段名应该是create_time,而非created_at。"

Claude回应"抱歉,我马上修改",随后重新生成了SQL。

SELECT id, policy_no, create_time, surrender_amount, status FROM policy_surrender WHERE create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY);

这次字段名对了,但执行依旧报错。

surrender_amount字段同样不存在。该表存储退保金额的字段实际是refund_amount

我再次纠正,Claude再次道歉并修改。随后发现status也不对,实际字段名为surrender_status

三个字段全部猜错。

更令人困扰的是,它在编写SQL时完全没有事先查询表结构的意识。这种表现很像一个刚入职的实习生,听到需求直接开始编码,完全不参考数据库文档。

为什么 AI 会"瞎猜"?

这个问题并非Claude Code独有,Kimi、DeepSeek、GPT等模型同样存在。

根本原因在于AI的"常识"与数据库的实际字段名之间存在巨大差异。

AI接触过大量代码和数据库设计,它"熟知"记录创建时间的字段通常命名为created_atcreate_timegmt_createcreated_date等。因此当收到"查询某张表"的指令时,它会从经验库中挑选一个最"常见"的字段名。

问题在于,你的数据库字段命名未必符合这些"常识"。

以保险行业系统为例,许多字段命名带有历史遗留特征:

  1. 有的字段叫create_time(标准中文拼音风格)
  2. 有的叫crt_tm(缩写风格)
  3. 有的叫createdAt(驼峰风格)
  4. 甚至有的叫c_time(极简风格)

AI猜对的概率大约在四分之一到六分之一之间。在涉及5到10个字段的复杂查询中,它全部猜对的概率可想而知。

更令人担忧的是,AI不会主动表明"我在猜测"。它生成SQL时语气极为自信,仿佛真的查验过表结构一般。只有在执行报错后,你才能发现它是在盲目推测。

我的解法:给 Claude 写了一个 6 步 Skill

经过多次被"折磨"后,我决定不再每次都手动纠正。我为它设计了一个数据库查询Skill,将其塑造成一个"遵守规矩的实习生"。

这个Skill的核心思想十分简洁:在任何SQL编写之前,必须先行查询表结构。这就像老程序员带新人时常说的:"先别急着写代码,先看看表里有哪些字段。"

6 步流程

用户查询需求 → 第1步:查表结构 → 第2步:查数据量 → 第3步:判断范围 → 第4步:生成SQL+检查索引 → 第5步:用户确认 → 第6步:执行并保存知识库

第1步:查表结构(最关键)

Claude必须首先执行以下操作。

DESCRIBE policy_surrender;-- 或SHOW COLUMNS FROM policy_surrender;-- 或(PostgreSQL)SELECT column_name, data_type, column_comment FROM information_schema.columns WHERE table_name = 'policy_surrender';

然后将结果明确展示给用户,而非悄悄进行。

第2步:查数据量

在生成SQL之前,先确认表的数据量。

SELECT COUNT(*) FROM policy_surrender;

第3步:判断范围,防止慢查询

如果数据量超过10万(阈值可自定义),必须暂停操作。

Claude需向用户提示如下:

不是直接执行,而是先进行询问。

第4步:生成 SQL,并检查索引

Claude根据表结构生成SQL,然后自行检查WHERE条件是否能命中索引。

EXPLAIN SELECT * FROM policy_surrender WHERE create_time >= '2025-05-01';

如果EXPLAIN结果显示type为ALL(全表扫描),Claude必须向用户发出警告。

第5步:用户确认

Claude将生成的SQL展示给用户,等待用户确认后再执行,不可自行运行。

第6步:保存知识库

查询完成后,Claude将该表的表结构、字段含义、数据量及索引信息保存到项目知识库。

后续用户再次查询该表时,Claude可直接读取知识库,无需重复执行DESCRIBE。

Skill 写成什么样?

Claude Code支持项目专属的Skill(位于.claude/skills/目录)。我的Skill文件内容如下。

# 数据库查询 Skill## 约束规则​当用户要求查询数据库时,必须严格遵守以下流程:​### 1. 查表结构- 执行 `DESCRIBE {table_name}``SHOW COLUMNS FROM {table_name}`- 将结果展示给用户- 不准猜测字段名,必须基于实际表结构​### 2. 查数据量- 执行 `SELECT COUNT(*) FROM {table_name}`- 如果数据量 > 100000,暂停执行,提示用户缩小范围​### 3. 判断范围- 询问用户是否需要加 WHERE 条件- 提供时间范围、ID 范围等建议​### 4. 生成 SQL + 检查索引- 根据表结构生成 SQL- 执行 `EXPLAIN` 检查索引命中情况- 如果全表扫描,警告用户​### 5. 用户确认- 展示 SQL,等待用户确认- 未经确认不准执行​### 6. 保存知识库- 将表结构信息保存到 `.claude/knowledge/db/{table_name}.md`- 格式:字段名 | 类型 | 含义 | 索引- 下次查询同一表时,优先读取知识库​## 禁止行为- 禁止猜测字段名- 禁止不查表结构直接写 SQL- 禁止不检查索引就执行大数据量查询- 禁止未经用户确认执行 SQL​## 示例​用户:查一下 policy_surrender 表最近 30 天的数据​正确流程:1. DESCRIBE policy_surrender → 展示字段2. SELECT COUNT(*) → 判断数据量3. 询问用户:是否需要加时间范围?建议按 create_time 查询4. 生成 SQL:SELECT * FROM policy_surrender WHERE create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)5. EXPLAIN 检查索引6. 展示 SQL,等待确认7. 执行并保存知识库

实际效果如何?

Skill上线后,Claude的行为模式发生了显著变化。

以前的表现如下。

我:查一下 policy_surrender 表最近 30 天的数据Claude:(直接生成 SQL3 个字段名全猜错)

现在的表现如下。

我:查一下 policy_surrender 表最近 30 天的数据Claude:我先查一下这张表的表结构。(执行 DESCRIBE,展示结果)这张表有 120 万条数据,建议加时间范围。你想按 create_time 查最近 30 天吗?(我确认后,生成 SQL,EXPLAIN 检查索引,展示给我看)这是 SQL,确认执行吗?(我确认后,执行)结果已保存到知识库,下次查这张表不用重复查结构。

不仅字段名不再猜错,更大的收益体现在以下几方面。

  1. 慢查询被拦截:有几次我差点执行全表扫描,Claude发出提醒后我添加了索引条件。
  2. 知识库逐渐积累:项目中30多张核心表的结构都被记录下来,新同事询问字段含义时可直接查阅知识库。
  3. 我无需再反复纠正:它已清楚规则,为我节省了大量口舌。

当然,偶尔仍会遇到需要人工介入的复杂场景。例如字段名特别模糊、中英文混杂,或业务含义与字面意思相差甚远时,Claude查看表结构后仍可能理解错误。这时我会直接告知正确答案,并让它更新知识库——"人工干预、知识库积累、避免重复错误"这一闭环运转起来后,操作越来越顺畅。

其他 AI 工具也能用吗?

这个Skill本质上是一套约束规则,并非Claude特有。

我随后将其改编为Prompt模板,同样适用于Kimi、DeepSeek等工具。

你是一个数据库查询助手。当用户要求查询数据库时,必须按以下步骤执行:​1. 先执行 DESCRIBE {table_name},展示表结构2. 执行 SELECT COUNT(*) FROM {table_name},判断数据量3. 数据量超过10万时,提示用户缩小范围4. 根据表结构生成SQL,执行EXPLAIN检查索引5. 展示SQL,等待用户确认6. 执行并保存表结构信息​禁止猜测字段名。禁止未经确认执行SQL

效果类似,但不如Claude Code的Skill那样自动化——因为Kimi和DeepSeek缺乏直接执行SQL的能力,需要手动复制粘贴。不过约束规则本身依然有效,至少能防止AI胡乱猜测字段名。

我仅在Claude Code上深度使用这个Skill,因为它能即时反馈、直接执行SQL,还能自动优化自身。其他工具我主要用来生成思路和初稿。

写在最后

为AI设定严格的查询流程能有效避免字段误判问题,这揭示了在数据库查询场景中,建立正确工作习惯远比依赖AI自由发挥更为关键。AI的创造力是双刃剑,它敢于猜测、尝试和犯错,但在数据库查询领域,"敢于猜测"恰恰是灾难的根源。一个好的Skill并非限制AI,而是帮助它在特定场景下建立正确的工作习惯。就像带领实习生一样,若没有持续的反复训练,它不会主动先查阅文档再动手编码。Claude Code的Skill机制正是为AI构建"肌肉记忆"的有效工具。如果你也曾因AI乱猜字段名而烦恼,不妨尝试这套6步流程,花费10分钟编写一个Skill,长期节省的纠正时间将远超这10分钟。