隐藏列

如果定义了带有隐式隐藏属性的表列,那么直到显式引用该列,该列才可用。 例如,如果对表运行 SELECT * 查询,那么结果表中不会返回隐式隐藏列。 始终可以指定列名的位置显式引用隐式隐藏列。

如果列及其条目由数据库管理器生成,那么将这类列定义为 IMPLICITLY HIDDEN 可尽量减少对应用程序的任何潜在负面影响。 例如,系统时间段时态表有 3 列的值由数据库管理器生成。 数据库管理器使用这些列来保存每个表行的历史版本。 大部分业务应用程序将使用历史数据,但几乎不会使用这 3 个生成列。 对应用程序隐藏这些列可缩短应用程序处理时间。

在表中插入数据时,不带列列表的 INSERT 语句不需要任何隐式隐藏列的值。 在这类情况下,如果输入包括隐式隐藏列的值,那么该值没有对应的目标列并且系统会返回错误 (SQLSTATE 42802)。 因为不带列列表的 INSERT 语句未包括隐式隐藏列的值,所有定义为隐式隐藏并且“非空”的任何列都必须具有已定义的缺省值

使用输入文件中的数据填充表时,导入、插入或装入之类的实用程序都需要您指定该操作是否包括隐藏列的数据。 如果未指定列列表,那么在处理包含隐式隐藏列的表时,数据移动实用程序必须使用 implicitlyhiddenincludeimplicitlyhiddenmissing 文件类型修饰符。 当数据移动实用程序迂到具有隐式隐藏列的表时,还可以使用 DB2_DMU_DEFAULT 注册表变量来设置缺省行为。 同样,导出操作需要您指定该操作是否包括隐藏列的数据。

可对新表使用 CREATE TABLE 语句或对现有表使用 ALTER TABLE 语句来对表列定义隐式隐藏属性。 如果使用带 LIKE 子句的 CREATE TABLE 语句来创建表,那么新表将继承源表中的任何隐式隐藏列。 可使用 ALTER TABLE 语句将隐藏列更改为不隐藏或将不隐藏列更改为隐藏。 改变表以更改某些列的隐藏属性可能会影响要处理该表的数据移动实用程序的行为。 例如,这可能意味着改变该表以定义某些隐藏列之前成功运行的装入操作现在返回错误 (SQLCODE -2437)。

用于标识 SELECT 查询中的结果表的列的名称列表,使用 public-name.* 运行 选项不包含任何隐式隐藏列。 带 order-by-clause 选项运行的 SELECT 查询可在 simple-column-name 中包括隐式隐藏列。

如果在具体化查询表定义中显式引用了隐式隐藏列,那么该列将成为具体化查询表的一部分。 但是,具体化查询表中的该列不会继承隐式隐藏属性。 此相同行为将应用于使用 as-result-table 子句创建的视图和表。

可在 CREATE INDEX 语句、ALTER TABLE 语句或引用约束中显式引用隐式隐藏列。

定义为隐式隐藏的任何列都存在转换变量。 在触发器主体中,可引用与隐式隐藏列对应的转换变量。

已创建临时表和已声明临时表中不支持隐式隐藏列。

可使用 DESCRIBE 命令显示表的隐藏列。
DESCRIBE TABLE tablename SHOW DETAIL

示例

  • 示例 1:在以下语句中,创建了带隐式隐藏列的表。
         CREATE TABLE CUSTOMER
         (
          CUSTOMERNO       INTEGER NOT NULL,
          CUSTOMERNAME     VARCHAR(80),
          PHONENO          CHAR(8) IMPLICITLY HIDDEN
         );
    SELECT * 仅返回对应 CUSTOMERNOCUSTOMERNAME 的列条目。 例如:
    A123, ACME
    B567, First Choice
    C345, National Chain
    除非显式引用,否则 PHONENO 列的条目会隐藏。
    SELECT CUSTOMERNO, CUSTOMERNAME, PHONENO
       FROM CUSTOMER   
  • 示例 2:如果数据库表包含隐式隐藏列,那么必须指定数据移动操作是否包括隐藏列的数据。 以下示例使用装入操作来说明用于指示是否包括隐藏列的数据的不同方法:
    • 使用 insert-column 来显式指定要在其中插入数据的列。
      db2 load from delfile1 of del
         insert into table1 (c1, c2, c3,...)
    • 使用某个隐藏列文件类型修饰符:指定 implicitlyhiddeninclude(如果输入文件包含隐藏列的数据)或 implicitlyhiddenmissing(如果输入文件未包含隐藏列的数据)。
      db2 load from delfile1 of del modified by implicitlyhiddeninclude
         insert into table1 
    • 在服务器端使用 DB2_DMU_DEFAULT 注册表变量来设置数据移动实用程序遇到带隐式隐藏列的表时的行为。
      db2set DB2_DMU_DEFAULT=IMPLICITLYHIDDENINCLUDE
      db2 load from delfile1 of del insert into table1