Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


标识符

📄字数 3.2K
👁️阅读量 加载中...

标识符定义

标识符是用于命名数据库对象的符号。

  • 数据库对象的分类:

    从数据的逻辑结构来说,数据库对象包括模式对象和非模式对象。

    模式是指一个用户所拥有的数据库对象的集合,用于权限管理和命名空间隔离。一般来说,一个模式往往对应于一个应用。用户在创建时会拥有一个缺省的模式,其模式名就等于用户名。

    • 模式对象
      • 表(TABLE)
      • 视图(VIEW)
      • 索引(INDEX)
      • 分区(PARTITION)
      • 序列(SEQUENCE)
      • 约束(CONSTRAINT)
      • 同义词(SYNONYM)
      • 触发器(TRIGGER)
      • 数据库链接(DATABASE LINK)
      • 自定义数据类型(UDT)
      • 函数(FUNCTION)
      • 存储过程(PROCEDURE)
      • 包(PACKAGE)

    非模式对象是指存储在数据库中,可以通过 SQL 创建和操作,但不属于某个模式的数据库对象。

    • 非模式对象
      • 用户(USER)
      • 角色(ROLE)

标识符命名

每个数据库对象都有一个名称。在 SQL 语句中,可以使用带引号的标识符或不带引号的标识符来表示对象的名称。

  • 引号标识符​:使用双引号 (") 或反引号 (`) 将标识符名称括起来。若对象在创建时使用了引号标识符,则在后续引用该对象时必须使用相同的引号包裹其名称。

  • 非引号标识符​:标识符名称不包含任何外部标点符号。

虽然两种标识符均可用于命名各类数据库对象,但是,数据库名称和数据库链接名称​始终不区分大小写。若以引号标识符形式指定此类名称,引号将被忽略​(即等同于非引号标识符)。

推荐数据库的对象命名遵循以下规范:

  • 使用完整的、描述性的、易拼写的名称或众所周知的缩写:在命名对象时,如果无法平衡简单易用性和描述性,请选择更具描述性的名称,例如,hire_date 明显优于 hd,避免了未来使用者因名称过于简略而产生理解障碍。

  • 使用一致的命名规则:使用一致的命名规则可以帮助用户理解每个表在应用程序中扮演的角色。例如,以 fin_ 为开头命名所有属于财务(FINANCE)应用程序的表的名称。

  • 使用相同的名称来描述跨表的同一实体或属性:当相同的业务实体或属性(如部门编号)出现在多个表中时,​应在所有相关表中使用一致的名称。例如,存储部门编号的列在 employees 表和 departments 表中均应统一命名为 department_id,明确标识其存储的是相同含义的数据。

标识符命名遵循以下规则:

  1. 标识符的长度为 1127 字节。

    如果一个标识符包含由点分隔的多个部分,则每个属性最多可长达 127 字节。每个点分隔符,以及任何包围的双引号,均计为 1 字节。例如:

    sql
    "schema"."table"."column"
  2. 未加引号的标识符不能是关键字。加引号的标识符可以是关键字,数据库不推荐使用关键字作为标识符。

    提示

  3. 未加引号的标识符不区分大小写。数据库将它们解释为大写(PostgreSQL 兼容模式除外,受兼容参数 def_compatible_mode 的影响)。加引号的标识符区分大小写。

  4. 在命名空间内,不能有两个对象具有相同的名称。

    • 以下模式对象共享一个命名空间(同一模式下不能重名,对象名称必须唯一):

      • 包(Package)

      • 私有同义词(PRIVATE SYNONYM)

      • 序列(SEQUENCE)

      • 存储过程(PROCEDURE)

      • 独立存储函数(FUNCTION)

      • 表(TABLE)

      • 用户定义类型(UDT)

      • 视图(VIEW)

    • 以下每个模式对象都有自己的命名空间(对象名称可以重复,互不影响):

      • 约束(CONSTRAINT)

      • 触发器(TRIGGER)

      • 索引(INDEX)

      • 数据库链接(DATABASE LINK)

  5. cata_case_sensitive控制系统字典(系统表)中对象名(如表、列)的存储和匹配是否区分大小写。

标识符的引用

标识符引用概述

数据库支持在 SQL 语句的上下文中引用模式对象。当前版本支持如下引用类型:

  • 引用模式对象

  • 引用分区表和索引

  • 引用自定义类型属性和方法

引用对象或其组成部分的语法为:

其中:

  • schema :对象所属模式名称。该标识符允许引用其他模式的对象(需具备权限),省略时默认引用当前用户模式中的对象。仅适用于表、视图、索引等模式对象,不适用于用户、角色等非模式对象

  • object :对象的名称。

  • part :对象的一部分,此标识符可以引用模式对象的一部分,例如表的列,但并非适用于所有类型的对象。

  • dblink :数据库链接标识符。用于访问远程数据库对象,省略时默认访问本地数据库对象。注意:部分 SQL 语句不支持远程访问。

引用模式对象

当在 SQL 语句中引用对象时,将根据上下文在命名空间中解析对象,之后执行对该对象的指定操作。如果在命名空间中找不到命名对象,则返回错误。

当对象与其他模式中的对象同名时,必须使用模式名称限定对象标识符才能够引用。

语法如下:

sql
schema.object

操作示例​:

  1. 删除模式 hr 中的表 employees:

    sql
    DROP TABLE hr.employees;
  2. 通过 CURRENT_SCHEMA 参数指定目标模式:

    sql
    SET CURRENT_SCHEMA TO hr;
    DROP TABLE employees;  -- 在指定模式中执行操作

引用数据库链接

访问非本地数据库中的对象,需在对象标识符后附加目标数据库的数据库链接名称。数据库链接是特殊的模式对象,用于建立与远程数据库的连接通道。

语法如下:

sql
schema.object@dblink

当发出包含数据库链接的 SQL 语句时,需要使用存储在数据字典中的完整数据库链接名称。

XuguDB 在连接远程数据库时,将使用数据库连接字符串访问远程数据库。使用数据库字符串、用户名和密码后连接成功,则 XuguDB 使用引用模式对象中的规则来访问远程数据库上的指定对象,但请注意,访问表对象属于其他模式时必须显式指定数据库名。

引用分区表和索引

表和索引可以被划分为多个分区中,并且在每个分区中具有相同的逻辑属性。例如,表中的所有分区共享相同的列和约束定义,而索引中的所有分区共享相同的索引列。

分区扩展名和子分区扩展可以用来执行某些分区级和子分区级操作。例如,仅在一个分区或子分区上删除所有行。如果没有扩展名称,则需要使用判断语句(WHERE 子句)定义删除范围。Range 分区表和 List 分区表并不适合使用判断语句定义分区级操作,尤其是当范围分区键使用多个列时。而 Hash 分区和子分区是基于系统定义的哈希函数,所以使用判断语句也很困难。

分区扩展名支持将分区作为独立表对象引用。该方法的优点为可通过视图实现分区级权限控制(Range 分区表效果最佳)。具体操作需要通过基于目标分区选择数据创建视图,然后该视图进行权限授予/回收操作。

分区与子分区的标准引用语法如下:

分区名的引用语法:

sql
schema.object PARTITION (partition_name)

子分区名的引用语法:

sql
schema.object SUBPARTITION (subpartition_name)

其中:

  • PARTITION 是分区关键字。

  • partition_name 是引用的分区名

  • SUBPARTITION 是子分区关键字。

  • subpartition_name 是引用的子分区名

在 SQL 语句中,引用分区需要在分区或子分区名称的周围加上括号。

引用自定义类型的属性和方法

在 SQL 语句中引用自定义类型(UDT)的属性或方法,可直接使用表名或别名进行引用。下面简要介绍两种主要的引用方式:

  1. 直接引用自定义类型,语法如下:

    sql
    udt(attribute, ...)

    其中:

    • udt 是自定义类型名,括号中为属性的值,根据定义的类型来指定值。
  2. 引用表的列使用自定义类型,或自定义类型中的属性或方法,语法如下:

    sql
    schema.object.column[.part]

    其中:

    • column 是自定义类型的实体化列名。

    • part 是自定义类型的属性列名、存储过程或函数,可选项。

    引用自定义类型属性和方法的完整操作示例,请参阅文档章节 用户自定义结构类型 中的示例。