虚拟外键
在某些情况下,您不想使用显式定义的外键。 不使用外键的原因可能包括性能问题(在 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 文件的目录,然后点击 保存。

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

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

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

