PhpStorm 2021.3 Help

外键

外键关系指定表如何相互关联并指示表之间的关系。PhpStorm 识别数据库模式中的外键关系并使用它们来构造 JOIN 子句。您可以在自动完成列表、数据导航和图表中看到这些关系。

在 PhpStorm 中,您可以使用显式外键或创建虚拟外键。

外键是一个表中的一个字段或一组字段,它引用另一个表中的主键。当您创建或修改表时,您可以清楚地定义这些键:

CREATE TABLE 访问者(id int NOT NULL,activity_id int NOT NULL,PRIMARY KEY (id),FOREIGN KEY (activity_id) REFERENCES activity(activity_id));

包含外键的表是子表。包含候选键的表是引用表或目标表。如果您的数据库包含显式外键关系,PhpStorm 会自动在自动完成、数据导航和图表中使用它们。

在下面的示例中,activity.activity_id是主键,visitor.activity_id而是外键。

显式外键

在数据库中创建外键

  1. 数据库工具窗口(查看 | 工具窗口 | 数据库)中,展开数据源树直到子表的节点。

  2. 右键单击子表并选择新建 | 外键

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

  4. 在“”窗格中,单击“添加”按钮添加按钮

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

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

  7. 单击执行

    创建外键

虚拟外键

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

在这种情况下,您仍然可以在不更改数据库代码的情况下创建外键关系。作为外键的替代,虚拟外键没有在数据库代码中定义。

考虑以下示例查询:

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

让我们假设它visitor_id没有被定义为数据库中的外键。您仍然可以在此 JOIN 子句中使用表中的字段和表中的visitor_id字段之间的这种虚拟关系。您可以保存此关系并在以后使用它,也可以使用正则表达式在设置中为虚拟外键配置规则。activityidvisitor

虚拟外键

创建虚拟外键

  1. 单击 ON 子句中的表关系并按Alt+Enter

  2. 选择存储表关系

    该关系保存在external-data.xml中。您可以为 XML 文件选择其他名称以及存储此文件的其他位置。要更改或查看 XML 文档的路径,请按 打开数据源设置Shift+Enter,单击选项选项卡并查看虚拟对象和属性字段。

为虚拟外键创建规则

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

  1. 打开设置 ( Ctrl+Alt+S) 并导航到编辑器 | 代码完成

  2. 滚动到SQL部分。

  3. 在表中,单击添加按钮 ( 单击添加按钮)

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

  5. 双击目标列模式单元格并键入替换模式。替换模式使用来自Column 模式表达式的匹配,并被解释为正则表达式。您可以在Generated pattern字段中查看结果。生成的模式字段中的结果表达式必须匹配所需的table.column模式。

    您可以使用检查按钮 ( 检查按钮) 检查您的规则。单击“检查”按钮时,将打开“规则调试器”对话框。

    虚拟外键的调试规则

虚拟外键的调试规则

  1. 打开设置 ( Ctrl+Alt+S) 并导航到编辑器 | 代码完成

  2. 滚动到SQL部分。

  3. 单击检查按钮 ( 检查按钮)。

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

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

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

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

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

      注意目标列模式替换模式用于在带有捕获组的生成模式字段中生成正则表达式模式。确保对按字面意思翻译的符号进行双转义,如示例表达式 ( $1\\.(?i)id) 中的点。

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

    • 生成模式:生成的只读正则表达式模式,与目标 table.column名称匹配。Generated pattern是由Target column pattern中的替换模式生成的结果。

    • Target table.column:表和列名的示例,将用作Source 列中虚拟外键的主键。

    虚拟外键的调试规则

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

PhpStorm 可以为您生成 JOIN 语句可能的代码完成建议列表。代码完成列表包括来自其他表的列的建议,这些列与 JOIN 语句中的表中的列同名。

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

  1. Ctrl+Alt+S并导航到 编辑器 |打开设置 一般 | 代码完成

  2. 向下滚动到SQL部分,选择Suggest non-strict foreign keys based on the name matching

    已选中复选框

    复选框已清除

    根据名称匹配建议非严格外键开启
    根据名称匹配建议非严格外键关闭

生产力提示

修改生成的索引和键名的模板

当您创建索引,以及主键和外键约束时,它们的默认名称是根据相应的模板生成的。例如,对于主键,模板是{table}_{columns}_pk.

  • 要查看和修改这些模板,请打开设置Ctrl+Alt+S并导航到Editor | 代码风格 | SQL | 常见的 SQL。单击代码生成选项卡。

    模板可以包含变量和文本。当您生成名称时,指定的文本会逐字复制。例如,当您{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子菜单中,您可以选择要导航到的相关行类型。

    • 引用的行:当前对象引用的行。

    • 引用行:引用当前对象的行。

    • 所有相关行:引用行和引用行。

    引用和引用数据

    在数据编辑器中,您现在可以选择多个值并导航到相关数据。

    在相关行之间导航
最后修改时间:2021 年 11 月 22 日