IntelliJ IDEA 2026.1 Help

虚拟外键

在某些情况下,您不想使用显式定义的外键。 不使用外键的原因可能包括性能问题(在 CRUD 操作中)、数据库特性(如 ClickHouse 和 Apache Cassandra 等数据库不支持外键)、使用临时表(用于测试)、个人原因等。

在这种情况下,您仍然可以不更改数据库代码的前提下创建外键关系。 要做到这一点,请使用 virtual foreign keys。 虚拟外键是一个 IDE 虚拟对象。 相对于外键,虚拟键并未在数据库代码中定义。

请考虑以下示例查询:

SELECT * FROM activity JOIN visitor ON visitor_id = visitor.id

假设 visitor_id 未在数据库中定义为外键。 您仍然可以在 JOIN 子句中使用 visitor_id 表中的 activity 字段与 visitor 表中的 id 字段之间的虚拟关系。 您可以 保存此关系并稍后使用,或在设置中使用正则表达式为虚拟外键 配置规则

虚拟外键

虚拟外键关系存储在 external-data-<data_source_name>.xml 。 您可以为 XML 文件选择另一个名称并选择其他位置存储该文件。 若要更改或查看 XML 文档的路径,请按 Shift+Enter 打开数据源设置,点击 选项 选项卡,并查看 虚拟对象和特性 字段。

虚拟外键(虚拟外键 )可以在 数据库 工具窗口中找到。

数据库中的虚拟外键

创建虚拟外键

  1. 数据库 工具窗口中,展开数据源树直到表的节点。

  2. 右键点击表节点并选择 新建 | 虚拟外键

  3. 在打开的 修改 对话框中,在 名称 字段中输入您的虚拟外键名称。

  4. 目标表 窗格中,指定目标表的名称。

  5. 窗格中,点击 添加 按钮("添加"按钮)。

  6. 列名 字段中,指定子表中列的名称。

  7. 目标名称 字段中,指定目标表中列的名称。

  8. 点击 确定 以添加您的虚拟外键。

  9. 如果打开了 为 <data_source_name> 保存外部数据 对话框,请为 external-data-<data_source_name>.xml 文件指定目录,并点击 保存

在"修改"对话框中创建虚拟外键
  1. 点击 ON 子句中的表关系并按 Alt+Enter

  2. 选择 存储表关系

  3. 如果打开了 为 <data_source_name> 保存外部数据 对话框,请为 external-data-<data_source_name>.xml 文件指定目录,并点击 保存

存储表关系

创建虚拟外键规则

您可以使用正则表达式创建一个规则,根据该规则,IntelliJ IDEA 会将一个表中的列指向另一个表中的列。

  1. 打开设置 (Ctrl+Alt+S ),导航至 数据库 | 其他

  2. 定位到 虚拟外键 部分。

  3. 在表格中,点击 添加 按钮(点击添加按钮)。

  4. 双击 列模式 单元格并键入将匹配您要用作虚拟外键的列名的正则表达式。

  5. 双击 目标列模式 单元格并输入替换模式。 替换模式使用来自 列模式 表达式的匹配,并被解释为正则表达式。

    您可以通过使用 检查… 按钮("检查"按钮 )来检查您的规则。 当您选择规则并点击 检查… 按钮时,会打开 规则调试器 对话框。 您可以在 生成的模式: 字段中看到结果。 结果在 生成的模式: 字段中的表达式必须符合所需的 目标表.列: 模式。

    创建虚拟外键规则

虚拟外键的调试规则

  1. 打开设置 (Ctrl+Alt+S ),导航至 数据库 | 其他

  2. 定位到 虚拟外键 部分。

  3. 请选择规则并点击 检查… 按钮("检查"按钮)。

  4. 规则调试器 对话框中,填写以下字段:

    • 列模式: :将匹配您希望用作虚拟外键的列名的正则表达式。

      例如,要描述使用 _id 后缀的列,请使用 (.*)_(?i)id 正则表达式。 这个正则表达式将会找到类似 visitor_idvisitor_Id 的列,并将 visitors 作为第一个捕获组 ($1)。

    • 目标列模式: :使用来自 列模式: 表达式的匹配项,并被解释为正则表达式的替换模式。 您可以在 生成的模式: 字段中看到结果。 请注意,只有当您在 源列: 字段中给出列名示例时,结果才会显示。

      例如,我们可以使用从 列模式: 表达式中捕获的组($1 ),添加一个点( )和 id。 此表达式将生成 visitor.id 引用,供我们用作主键。

      注意目标列模式: 替代模式用于在 生成模式 字段中生成带有捕获组的正则表达式模式。 确保将像示例表达式中的点 ($1\\.(?i)id) 这样的符号双重转义。

    • 源列: :您想用作虚拟外键的列名示例。

    • 生成的模式: :一个与 目标表.列: 名称匹配的只读正则表达式模式。 生成的模式: 是由 目标列模式: 中的替换模式生成的结果。

    • 目标表.列: :作为虚拟外键的主键使用的表和列名称示例将在 源列: 中使用。

    虚拟外键的调试规则

在代码自动完成中显示虚拟外键

IntelliJ IDEA 可以为 JOIN 语句生成可能的代码补全建议列表。 代码补全列表包括来自其他表的列的建议,这些列与 JOIN 语句中的表中的列具有相同的名称。

例如,考虑 actor 表具有以下列: actor_idfirst_namelast_namelast_update。 在建议列表中,您将看到其他表中出现的这些列名称的可能补全。

  1. Ctrl+Alt+S 打开设置,然后转到 编辑器 | 常规 | 代码完成

  2. 向下滚动到 SQL 部分,选择 根据名称匹配建议非严格外键

    建议基于名称匹配的非严格外键已开启
    基于名称匹配的推荐非严格外键已关闭
2026年 3月 24日