名称解析

要在查询中引用一个对象(例如,一个表),可以指定一个数据库、一个模式或者两者都指定,或者都不指定。为了解析查询引用的对象,hubble会按照一组规则扫描适当的命名空间。

命名层次结构

为了与PostgreSQL兼容,hubble支持names的三级结构。这称为命名层次结构。

在命名层次结构中,存储对象的路径包含三个部分:

  • 数据库名称
  • 模式名称
  • 对象名称

hubble集群可以存储多个数据库。每个数据库可以存储多个模式,每个模式可以存储多个表、视图、序列和用户定义的类型。

首次启动集群时,会包含许多预加载的数据库和模式,包括defaultdb数据库和public模式。默认情况下,对象(例如,表)存储在当前数据库(默认情况下)中的预加载public模式中。

要创建新数据库,请使用CREATE DATABASE语句;要创建新模式,请使用CREATE SCHEMA语句。所有数据库的列表可以通过SHOW DATABASES查看,可以使用SHOW SCHEMAS获取给定数据库的所有模式的列表,可以使用其他SHOW语句获得给定模式的所有对象的列表。

从以前版本的数据库迁移命名空间

建议使用模式命名空间,而不是数据库命名空间,来创建命名结构。如果您要升级,请在升级完成后执行以下操作的任意组合:

  • 在集群上的数据库中创建新模式。创建模式后,根据需要使用ALTER TABLE ... RENAMEALTER SEQUENCE ... RENAMEALTER TYPE ... RENAMEALTER VIEW ... RENAME语句在数据库之间移动对象。要在模式之间移动对象,请使用ALTER TABLE ... SET SCHEMAALTER SEQUENCE ... SET SCHEMAALTER VIEW ... SET SCHEMA
  • 如果您的集群包含跨数据库引用(例如,跨数据库外键引用或跨数据库视图引用),请使用相关ALTER TABLEALTER SEQUENCEALTER TYPEALTER VIEW语句将任何交叉引用对象移动到同一数据库,但不同模式。早期版本允许跨数据库对象引用,以使数据库对象命名层次结构对用户更加灵活。

名称解析的工作原理

名称解析分别发生以查找现有对象并确定新对象的全名。

查找现有对象的规则如下:

  • 如果名称已经完全指定了数据库和模式,请使用该信息。
  • 如果名称具有单组件前缀(例如,模式名称),请尝试在当前数据库和当前模式中查找具有前缀名称的模式。如果失败,请尝试在public具有前缀名称的数据库模式中查找对象。
  • 如果名称没有前缀,则使用当前数据库的搜索路径。

同样,决定新对象全名的规则如下:

  • 如果名称已经完全指定了数据库和模式,请使用它。
  • 如果名称具有单组件前缀(例如,模式名称),请尝试查找具有该名称的模式。如果不存在这样的架构,请使用public数据库中带有前缀名称的架构。
  • 如果名称没有前缀,则使用当前数据库中的当前模式。

名称解析参数

当前数据库

当前数据库在名称不合格或只有一个组件前缀时使用。它是database会话变量的当前值。

  • 您可以使用SHOW database查看会话变量的当前值,并使用SET database更改它。
  • 对于使用表单URL连接到数据库的客户端应用程序,可以使 URL的路径组件设置会话变量postgres://...的初始值。例如,postgres://node/mydb设置databasemydb建立连接。

搜索路径

当名称不合格(即没有前缀)时使用搜索路径。它列出了查找对象的模式。它的第一个元素也是创建新对象的当前模式。

  • 您可以使用SET search_path设置当前搜索路径并使用SHOW search_path进行检查。
  • 您可以用SHOW SCHEMAS列出的有效模式列表。
  • 默认情况下,搜索路径包含$userpublicpg_catalogpg_extension。为了与PostgreSQL兼容,pg_catalog必须始终存在search_path,即使未使用SET search_path

当前架构

如果名称没有前缀,则在创建新对象时将当前模式用作目标模式。

  • search_path为了与PostgreSQL兼容,当前模式始终是默认第一个值。
  • 可以使用特殊的内置函数检查当前模式current_schema()

索引名称解析

hubble支持以下方法来为需要一个索引名称的语句指定索引名称(例如DROP INDEXALTER INDEX ... RENAME):

  • 索引名称使用@字符(例如)相对于表名称进行解析DROP INDEX tbl@idx,这是默认和最常见的语法。
  • 索引名称是通过搜索当前模式中的所有表来解析的,以查找具有名为idx的索引的表,例如DROP INDEX idx或(具有可选模式前缀)DROP INDEX public.idx;这种语法对于 PostgreSQL兼容性是必要的,因为PostgreSQL索引名称存在于模式命名空间中。