# 虚拟外键

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com.cn/help/idea/llms.txt).

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

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

请考虑以下示例查询：

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

假设  `visitor_id`  未在数据库中定义为外键。 仍可在此  `JOIN`  子句中使用  `活动`  表中的  `visitor_id`  字段与  `访客`  表中的  `id`  字段之间的虚拟关系。 您可以 [保存此关系](#create_a_virtual_foreign_key_in_query_console)并稍后使用，或在设置中使用正则表达式为虚拟外键 [配置规则](#configure-rules-for-virtual-foreign-keys)。

![虚拟外键](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_implicit_foreign_key.svg)

> **Tip:**
> 如果您有指向另一个模式中的对象的外键，并且这些对象具有相同的名称，它们将在外键导航对话框中显示为限定。

虚拟外键关系存储在  `external-data-<data_source_name>.xml` 。 您可以为 XML 文件选择另一个名称，并选择其他位置来存储此文件。 若要更改或查看 XML 文档的路径，请按 `Shift+Enter` (Windows), `⌘ I` (macOS), `⇧ ⏎` (IntelliJ IDEA Classic (macOS)), `⌘ I` (macOS System Shortcuts), `Shift+Enter` (XWin), `Shift+Enter` (GNOME), `Shift+Enter` (KDE), `Shift+Enter` (Emacs), `Shift+Enter` (Sublime Text), `⌘ I` (Sublime Text (macOS)), `Shift+Enter` (Visual Studio), `⌘ I` (Visual Studio (macOS)), `Shift+Enter` (NetBeans), `Shift+Enter` (Eclipse), `⌘ I` (Eclipse (macOS)) 打开数据源设置，点击   选项   选项卡，并查看   虚拟对象和特性头   字段。

虚拟外键（ ![虚拟外键](https://resources.jetbrains.com.cn/help/img/idea/2026.3/database-plugin.icons.expui.virtualForeignKey.svg)）可以在   数据库  工具窗口中找到。

* 有关其他节点和对象图标的参考信息，请参阅 [数据库工具窗口](database-tool-window.html) 主题中的 [数据源及其元素](database-tool-window.html#icons-for-data-sources-and-their-elements) 章节。

* 关于表列图标，请参阅 [栏目可能的图标组合](database-tool-window.html#possible-icon-combinations-for-columns) 章节。

* 使用 [视图选项](database-tool-window.html#view_options) 菜单中的树对象视图选项隐藏、排序、过滤和分组树对象。

![数据库中的虚拟外键](https://resources.jetbrains.com.cn/help/img/idea/2026.3/database_object_virtual_foreign_key.png)

## 创建虚拟外键

在修改对话框中:

Procedure:

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

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

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

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

5. 在   列   窗格中，点击   添加   按钮 ( !["添加"按钮](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.expui.general.add.svg))。

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

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

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

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

> **Note:**
> 可用字段和选项取决于 DBMS。 有关更多详细信息，请参阅 DBMS 的官方文档。

![在“修改”对话框中创建虚拟外键。](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_create_virtual_foreing_key_in_modify_dialog.png)

在查询控制台:

Procedure:

1. 点击  `ON`  子句中的表关系，然后按 `Alt+Enter` (Windows), `⌥ ⏎` (macOS), `⌥ ⏎` (IntelliJ IDEA Classic (macOS)), `⌥ ⏎` (macOS System Shortcuts), `Alt+Enter` (XWin), `Alt+Enter` (GNOME), `Alt+Enter` (KDE), `Alt+Enter` (Emacs), `Alt+Enter` (Sublime Text), `⌥ ⏎` (Sublime Text (macOS)), `Alt+Enter` (Visual Studio), `⌥ ⏎` (Visual Studio (macOS)), `Alt+Enter` (NetBeans), `Ctrl+1` (Eclipse), `⌘ 1` (Eclipse (macOS))。

2. 选择   存储表关系  。

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

> **Note:**
> 可用字段和选项取决于 DBMS。 有关更多详细信息，请参阅 DBMS 的官方文档。

![存储表关系](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_store_table_relation.png)

Procedure: 创建虚拟外键规则

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

1. 打开设置 ( `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)))，导航至  `数据库 | 其他` 。

2. 找到   虚拟外键   部分。

3. 在表格中，点击   添加  按钮( ![点击添加按钮](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.expui.general.add.svg))。

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

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

您可以通过使用   检查……  按钮( ![“检查”按钮](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.expui.gutter.run.svg))来检查您的规则。 当您选择规则并点击   检查……  按钮时，会打开   规则调试器  对话框。 您可以在   生成模式：   字段中看到结果。 结果在   生成模式：  字段中的表达式必须符合所需的   目标表.列：  模式。

![创建虚拟外键规则](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_create_rules_for_virtual_foreign_keys.png)

Procedure: 虚拟外键的调试规则

1. 打开设置 ( `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)))，导航至  `数据库 | 其他` 。

2. 找到   虚拟外键   部分。

3. 请选择规则并点击   检查……  按钮( ![“检查”按钮](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.expui.gutter.run.svg))。

4. 在   规则调试器  对话框中，填写以下字段：

* 列模式： ：将匹配您希望用作虚拟外键的列名的正则表达式。 例如，要描述使用 `_id` 后缀的列，请使用 `(.*)_(?i)id` 正则表达式。 这个正则表达式将会找到类似 `visitor_id` 或 `visitor_Id` 的列，并将 `visitors` 作为第一个捕获组 ( `$1` )。

* 目标列模式： ：使用来自 列模式： 表达式的匹配项，并被解释为正则表达式的替换模式。 您可以在 生成模式： 字段中看到结果。 请注意，只有当您在 源列： 字段中给出列名示例时，结果才会显示。 例如，我们可以使用从 列模式： 表达式中捕获的组( `$1` )，添加一个点( `。` )和 `id` 。 此表达式将生成 `visitor.id` 引用，供我们用作主键。 注意 ： 目标列模式： 替代模式用于在 生成模式 字段中生成带有捕获组的正则表达式模式。 确保将像示例表达式中的点 ( `$1\\.(?i)id` ) 这样的符号双重转义。

* 源列： ：您想用作虚拟外键的列名示例。

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

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

![虚拟外键的调试规则](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_rule_debugger_for_virtual_foreign_keys.png)

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

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

例如，考虑  `actor`  表具有以下列：  `actor_id` 、  `名字名称` 、  `姓氏名称` 、  `last_update` 。 在建议列表中，您将看到其他表中出现的这些列名称的可能补全。

1. 按 `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)) 打开设置，然后转到  `编辑器 | 常规 | 代码补全 | 弹出窗口` 。

2. 向下滚动到   SQL  部分，选择   基于名称匹配建议非严格密钥  。

复选框已选中:

![建议基于名称匹配的非严格外键已开启](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_suggest_non_strict_foreign_keys_based_on_the_name_matching_on.png)

复选框已清除:

![基于名称匹配的推荐非严格外键已关闭](https://resources.jetbrains.com.cn/help/img/idea/2026.3/db_suggest_non_strict_foreign_keys_based_on_the_name_matching_off.png)

