外键
外键关系指定表如何相互关联并指示表之间的关系。PhpStorm 识别数据库模式中的外键关系并使用它们来构造 JOIN 子句。您可以在自动完成列表、数据导航和图表中看到这些关系。
在 PhpStorm 中,您可以使用显式外键或创建虚拟外键。
外键是一个表中的一个字段或一组字段,它引用另一个表中的主键。当您创建或修改表时,您可以清楚地定义这些键:
包含外键的表是子表。包含候选键的表是引用表或目标表。如果您的数据库包含显式外键关系,PhpStorm 会自动在自动完成、数据导航和图表中使用它们。
在下面的示例中,activity.activity_id
是主键,visitor.activity_id
而是外键。
在数据库中创建外键
在数据库工具窗口( )中,展开数据源树直到子表的节点。
右键单击子表并选择
。在目标表窗格中,指定目标表的名称。
在“列”窗格中,单击“添加”按钮。
在From字段中,指定子表中列的名称。
在To字段中,指定目标表中列的名称。
单击执行。
虚拟外键
在某些情况下,您不想使用显式定义的外键。不使用外键的原因可能包括性能问题(在 CRUD 操作中)、数据库特性(ClickHouse 和 Apache Cassandra 等数据库不支持外键)、临时表的使用(用于测试)、个人原因等。
在这种情况下,您仍然可以在不更改数据库代码的情况下创建外键关系。作为外键的替代,虚拟外键没有在数据库代码中定义。
考虑以下示例查询:
让我们假设它visitor_id
没有被定义为数据库中的外键。您仍然可以在此 JOIN 子句中使用表中的字段和表中的visitor_id
字段之间的这种虚拟关系。您可以保存此关系并在以后使用它,也可以使用正则表达式在设置中为虚拟外键配置规则。activity
id
visitor
创建虚拟外键
单击 ON 子句中的表关系并按Alt+Enter。
选择存储表关系。
该关系保存在external-data.xml中。您可以为 XML 文件选择其他名称以及存储此文件的其他位置。要更改或查看 XML 文档的路径,请按 打开数据源设置Shift+Enter,单击选项选项卡并查看虚拟对象和属性字段。
为虚拟外键创建规则
您可以使用正则表达式创建规则,根据该规则 PhpStorm 将一个表中的列指向另一个表中的列。
打开设置 ( Ctrl+Alt+S) 并导航到
。滚动到SQL部分。
在表中,单击添加按钮 ( )
双击列模式单元格并键入将匹配要用作虚拟外键的列名的正则表达式。
双击目标列模式单元格并键入替换模式。替换模式使用来自Column 模式表达式的匹配,并被解释为正则表达式。您可以在Generated pattern字段中查看结果。生成的模式字段中的结果表达式必须匹配所需的
table.column
模式。您可以使用检查按钮 ( ) 检查您的规则。单击“检查”按钮时,将打开“规则调试器”对话框。
虚拟外键的调试规则
打开设置 ( Ctrl+Alt+S) 并导航到
。滚动到SQL部分。
单击检查按钮 ( )。
在规则调试器对话框中,填写以下字段:
列模式:将匹配要用作虚拟外键的列名的正则表达式。
例如,要描述使用
_id
后缀的列,请使用(.*)_(?i)id
正则表达式。此正则表达式将找到类似visitor_id
or的列visitor_Id
,并将visitors
其作为第一个捕获组 ($1
) 捕获。目标列模式:使用来自列模式表达式的匹配并被解释为正则表达式的替换模式。您可以在Generated pattern字段中查看结果。请注意,仅当您在源列字段中给出列名示例时才会显示结果。
例如,我们可以使用从Column 模式
$1
表达式中捕获的组 ( ) ,添加一个点 ( ) 和。此表达式将生成我们可以用作主键的引用。.
id
visitor.id
注意:目标列模式替换模式用于在带有捕获组的生成模式字段中生成正则表达式模式。确保对按字面意思翻译的符号进行双转义,如示例表达式 (
$1\\.(?i)id
) 中的点。源列:要用作虚拟外键的列名示例。
生成模式:生成的只读正则表达式模式,与目标 table.column名称匹配。Generated pattern是由Target column pattern中的替换模式生成的结果。
Target table.column:表和列名的示例,将用作Source 列中虚拟外键的主键。
在代码完成中显示虚拟外键
PhpStorm 可以为您生成 JOIN 语句可能的代码完成建议列表。代码完成列表包括来自其他表的列的建议,这些列与 JOIN 语句中的表中的列同名。
例如,考虑该actor
表具有以下列:actor_id
、first_name
、last_name
、last_update
。在建议列表中,您将看到其他表中显示的这些列名称的可能补全。
按Ctrl+Alt+S并导航到
。向下滚动到SQL部分,选择Suggest non-strict foreign keys based on the name matching。
已选中复选框
复选框已清除
生产力提示
修改生成的索引和键名的模板
当您创建索引,以及主键和外键约束时,它们的默认名称是根据相应的模板生成的。例如,对于主键,模板是{table}_{columns}_pk
.
要查看和修改这些模板,请打开设置Ctrl+Alt+S并导航到代码生成选项卡。
。单击模板可以包含变量和文本。当您生成名称时,指定的文本会逐字复制。例如,当您
{table}_pk
在表中应用模板时actor
,生成的主键名称将为actor_pk
.要查看有关变量及其用法的信息,请单击一个字段并按Ctrl+Q。
{unique?u:}
检查索引是否唯一并插入相应的字符序列。如果索引是唯一的,则模板会生成一个名称,其中指定的字符序列介于?
和之间:
。对于{unique?u:}
模板,它是u
. 如果索引不是唯一的,则插入:
和之间的序列。}
对于{unique?u:}
模板,它什么都不是。例子
您有
persons
带有列FirstName
和的表LastName
。该{table}_{columns}_{unique?u:}index
模板为非唯一索引生成以下名称:persons_FirstName_LastName_index
.
在相关行之间导航
右键单击表中的列并选择Go To。在Go To子菜单中,您可以选择要导航到的相关行类型。
引用的行:当前对象引用的行。
引用行:引用当前对象的行。
所有相关行:引用行和引用行。
在数据编辑器中,您现在可以选择多个值并导航到相关数据。