虚拟外键
在某些情况下,您不想使用显式定义的外键。 不使用外键的原因可能包括性能问题(在 CRUD 操作中)、数据库特性(如 ClickHouse 和 Apache Cassandra 等数据库不支持外键)、使用临时表(用于测试)、个人原因等。
在这种情况下,您仍然可以不更改数据库代码的前提下创建外键关系。 要做到这一点,请使用 virtual foreign keys。 虚拟外键是一个 IDE 虚拟对象。 相对于外键,虚拟键并未在数据库代码中定义。
请考虑以下示例查询:
假设 visitor_id 未在数据库中定义为外键。 您仍然可以在 JOIN 子句中使用 visitor_id 表中的 activity 字段与 visitor 表中的 id 字段之间的虚拟关系。 您可以 保存此关系并稍后使用,或在设置中使用正则表达式为虚拟外键 配置规则。
虚拟外键关系存储在 external-data-<data_source_name>.xml 。 您可以为 XML 文件选择另一个名称并选择其他位置存储该文件。 若要更改或查看 XML 文档的路径,请按 Shift+Enter 打开数据源设置,点击 选项 选项卡,并查看 虚拟对象和特性 字段。
虚拟外键( )可以在 数据库 工具窗口中找到。

创建虚拟外键
在 数据库 工具窗口中,展开数据源树直到表的节点。
右键点击表节点并选择 。
在打开的 修改 对话框中,在 名称 字段中输入您的虚拟外键名称。
在 目标表 窗格中,指定目标表的名称。
在 列 窗格中,点击 添加 按钮(
)。
在 列名 字段中,指定子表中列的名称。
在 目标名称 字段中,指定目标表中列的名称。
点击 确定 以添加您的虚拟外键。
如果打开了 为 <data_source_name> 保存外部数据 对话框,请为 external-data-<data_source_name>.xml 文件指定目录,并点击 保存。

点击
ON子句中的表关系并按 Alt+Enter。选择 存储表关系。
如果打开了 为 <data_source_name> 保存外部数据 对话框,请为 external-data-<data_source_name>.xml 文件指定目录,并点击 保存。

创建虚拟外键规则
您可以使用正则表达式创建一个规则,根据该规则,IntelliJ IDEA 会将一个表中的列指向另一个表中的列。
打开设置 (Ctrl+Alt+S ),导航至 。
定位到 虚拟外键 部分。
在表格中,点击 添加 按钮(
)。
双击 列模式 单元格并键入将匹配您要用作虚拟外键的列名的正则表达式。
双击 目标列模式 单元格并输入替换模式。 替换模式使用来自 列模式 表达式的匹配,并被解释为正则表达式。
您可以通过使用 检查… 按钮(
)来检查您的规则。 当您选择规则并点击 检查… 按钮时,会打开 规则调试器 对话框。 您可以在 生成的模式: 字段中看到结果。 结果在 生成的模式: 字段中的表达式必须符合所需的 目标表.列: 模式。

虚拟外键的调试规则
打开设置 (Ctrl+Alt+S ),导航至 。
定位到 虚拟外键 部分。
请选择规则并点击 检查… 按钮(
)。
在 规则调试器 对话框中,填写以下字段:
列模式: :将匹配您希望用作虚拟外键的列名的正则表达式。
例如,要描述使用
_id后缀的列,请使用(.*)_(?i)id正则表达式。 这个正则表达式将会找到类似visitor_id或visitor_Id的列,并将visitors作为第一个捕获组 ($1)。目标列模式: :使用来自 列模式: 表达式的匹配项,并被解释为正则表达式的替换模式。 您可以在 生成的模式: 字段中看到结果。 请注意,只有当您在 源列: 字段中给出列名示例时,结果才会显示。
例如,我们可以使用从 列模式: 表达式中捕获的组(
$1),添加一个点(。)和id。 此表达式将生成visitor.id引用,供我们用作主键。注意: 目标列模式: 替代模式用于在 生成模式 字段中生成带有捕获组的正则表达式模式。 确保将像示例表达式中的点 (
$1\\.(?i)id) 这样的符号双重转义。源列: :您想用作虚拟外键的列名示例。
生成的模式: :一个与 目标表.列: 名称匹配的只读正则表达式模式。 生成的模式: 是由 目标列模式: 中的替换模式生成的结果。
目标表.列: :作为虚拟外键的主键使用的表和列名称示例将在 源列: 中使用。

在代码自动完成中显示虚拟外键
IntelliJ IDEA 可以为 JOIN 语句生成可能的代码补全建议列表。 代码补全列表包括来自其他表的列的建议,这些列与 JOIN 语句中的表中的列具有相同的名称。
例如,考虑 actor 表具有以下列: actor_id、 first_name、 last_name、 last_update。 在建议列表中,您将看到其他表中出现的这些列名称的可能补全。
按 Ctrl+Alt+S 打开设置,然后转到 。
向下滚动到 SQL 部分,选择 根据名称匹配建议非严格外键。

