JET_INDEXCREATE 结构

适用于:Windows |Windows服务器

JET_INDEXCREATE结构包含在可扩展存储引擎 (ESE) 数据库中创建数据索引所需的信息。 结构由 JetCreateIndex2 等函数使用,并在 JET_TABLECREATEJET_TABLECREATE2等结构中使用。

typedef struct tagJET_INDEXCREATE {
  unsigned long cbStruct;
  tchar* szIndexName;
  tchar* szKey;
  unsigned long cbKey;
  JET_GRBIT grbit;
  unsigned long ulDensity;
  union {
    unsigned long lcid;
    JET_UNICODEINDEX* pidxunicode;
  };
  union {
    unsigned long cbVarSegMac;
    JET_TUPLELIMITS* ptuplelimits;
  };
  JET_CONDITIONALCOLUMN* rgconditionalcolumn;
  unsigned long cConditionalColumn;
  JET_ERR err;
  unsigned long cbKeyMost;
} JET_INDEXCREATE;

成员

cbStruct

此结构的大小(以字节为单位)。 将此成员设置为 sizeof ( JET_INDEXCREATE ) 。

szIndexName

要创建的索引的名称。

索引的名称必须满足以下条件:

  • 它必须小于JET_cbNameMost,不包括终止 null。

  • 它必须包含以下字符:0 (零) 到 9、A 到 Z、a 到 z、 和除“! (感叹号) ”、“ (逗号) ”、“[” (左括号) 和“]” (右括号) 以外的所有其他标点,即 ASCII 字符0x20、0x22 0x2d、0x2f 0x5a、0x5c、0x5d 0x7f。

  • 它不能以空格开头。

  • 它必须至少包含一个非空间字符。

szKey

指向以 null 分隔的标记的双 null 终止字符串的指针。

每个标记的格式为“<direction-specifiercolumn-name><>”,其中 direction-specification 为“+”或“-”。 例如,“+abc\0-def\0+ghi\0” szKey 将以升序) 、降序) (“def” ( (、升序顺序为“ghi” (的三列索引) 。 在 C 语言中,字符串文本具有隐含 NULL 终止符;因此,上述字符串将由双 NULL 终止。

szKey 中指定的列数可能不会超过JET_ccolKeyMost (依赖于版本的常量) 的值。

必须在 szKey 中至少命名一列。

过时行为:在双 NULL 终止符之后,可以指定语言 ID (传递到 MAKELCID ( langid 中的 WORD,SORT_DEFAULT ) ) 作为指定索引的 LCID 的方法。 通过在 grbit) 中设置JET_bitIndexUnicode,在 JET_UNICODEINDEX ( 中指定 szKey 中的语言 ID 和 LCID 是非法的。

已弃用:语言 ID 后,可以将 cbVarSegMac 作为 USHORT 传递。 如果在 szKey 中同时设置 USHORT,并且 cbVarSegMac 在结构中设置,则行为是未定义的。

cbKey

szKey 的长度(以字节为单位)包括两个终止 null。

grbit

一组位,其中包含下表中列出的零个或多个值。

含义

JET_bitIndexUnique

不允许 (键) 重复索引条目。 当调用 JetUpdate 时,而不是调用 JetSetColumn 时,将强制实施此操作。

JET_bitIndexPrimary

索引是聚集) 索引的主要 (。 每个表都必须有一个主索引。 如果表上未显式定义主索引,数据库引擎将创建自己的主索引。

JET_bitIndexDisallowNull

创建索引的列均不能包含 NULL 值。

JET_bitIndexIgnoreNull

如果索引的所有列均为 NULL,请不要为行添加索引项。

JET_bitIndexIgnoreAnyNull

如果索引的任何列为 NULL,请不要为行添加索引项。

JET_bitIndexIgnoreFirstNull

如果索引的第一列为 NULL,请不要为行添加索引项。

JET_bitIndexLazyFlush

索引操作将延迟记录。

JET_bitIndexLazyFlush不会影响数据更新的懒惰性。 如果索引操作被进程终止中断,软恢复仍能够使数据库处于一致状态,但索引可能不存在。

JET_bitIndexEmpty

请勿尝试生成索引,因为所有条目的计算结果为 NULL。 在传递JET_bitIndexEmpty时,grbit 还必须指定JET_bitIgnoreAnyNull。 这是性能增强功能。 例如,如果将新列添加到表中,则会在此新添加的列上创建索引,即使这些记录未添加到索引中,也会扫描表中的所有记录。 指定JET_bitIndexEmpty会跳过对表的扫描,这可能需要很长时间。

JET_bitIndexUnversioned

导致创建索引对其他事务可见。 通常,事务中的会话将无法在另一个会话中看到索引创建操作。 如果另一个事务可能创建相同的索引,则此标志可能很有用。 第二个索引创建将失败,而不是可能导致许多不必要的数据库操作。 第二个事务可能无法立即使用该索引。 索引创建操作必须先完成,然后才能使用。 会话当前不能位于事务中,无法创建索引而不提供版本信息。

JET_bitIndexSortNullsHigh

指定此标志会导致在索引中的所有列的数据之后对 NULL 值进行排序。

JET_bitIndexUnicode

指定此标志会影响结构中 lcid/pidxunicde 联合字段的解释。 设置位意味着 pidxunicode 字段实际上指向 JET_UNICODEINDEX 结构。 为 Unicode 数据编制索引,不需要JET_bitIndexUnicode。 它仅用于自定义 Unicode 数据的规范化。

JET_bitIndexTuples

指定索引是元组索引。 有关元组索引的说明,请参阅 JET_TUPLELIMITS

Windows XP 操作系统中引入了JET_bitIndexTuples。

JET_bitIndexTupleLimits

指定此标志会影响结构中 cbVarSegMac/ptuplelimits 联合字段的解释。 设置此位意味着 ptuplelimits 字段实际上指向 JET_TUPLELIMITS 结构,以允许自定义元组索引限制 (表示JET_bitIndexTuples) 。

Windows Server 2003 操作系统中引入了JET_bitIndexTupleLimits。

JET_bitIndexCrossProduct 0x00004000

为具有多值列的索引指定此标志将导致为这些键列中所有值的交叉乘积的每个结果创建索引项。 否则,索引对于作为多值列的最重要键列中的每一个多值只有一个条目,并且其中每个索引项都将使用来自其他任何多值列的多值列的第一个多值。

例如,如果为具有值“red”和“blue”的列 A 上的索引指定了此标志,并且对于值为“1”和“2”的 B 列,则将创建以下索引项:“red”、“1”;“red”, “2”;“blue”、“1”;“blue”、“2”。 否则,将创建以下索引条目:“red”、“1”;“blue”、“1”。

Windows Vista 操作系统中引入了JET_bitIndexCrossProduct。

JET_bitIndexKeyMost 0x00008000

指定此标志将导致索引使用结构中 cbKeyMost 字段中指定的最大键大小。 否则,索引将使用 JET_cbKeyMost (255) 作为其最大键大小。

JET_bitIndexKeyMost是在Windows Vista 中引入的。

JET_bitIndexDisallowTruncation 0x00010000

指定此标志将导致对索引进行任何更新,导致截断键失败,JET_errKeyTruncated。 否则,将无提示地截断键。 有关密钥截断的详细信息,请参阅 JetMakeKey 函数。

Windows Vista:Windows Vista 中引入了JET_bitIndexDisallowTruncation。

JET_bitIndexNestedTable 0x00020000

指定此标志将导致对多个多值列更新索引,但仅具有相同 itagSequence 的值。

Windows Vista 中引入了JET_bitIndexNestedTable。

ulDensity

初始索引 B+ 树的百分比密度。 指定小于 100 的数字最初会占用更多空间来创建索引,但允许将来的索引增长到位,从而避免内部碎片。

lcid

区域设置标识符 (LCID) 在 grbit 参数中未指定JET_bitIndexUnicode值时规范化数据时使用。 如果索引超过 Unicode 列,LCID 会影响规范化。

pidxunicode

如果在 grbit 参数中指定了JET_bitIndexUnicode值,则指向JET_UNICODEINDEX结构的指针。 这允许用户指定在 Unicode 规范化期间传递给 LCMapString 函数的自定义标志。

cbVarSegMac

grbit 参数中未指定JET_bitIndexTupleLimits值时,要存储在索引中的每个列的最大长度(以字节为单位)。

为此字段指定值 0 (零) 等效于:

  • 为主索引指定JET_cbPrimaryKeyMost。

  • 为辅助索引指定JET_cbSecondaryKeyMost。

ptuplelimits

如果 grbit 参数中指定了JET_bitIndexTupleLimits值,则指向JET_TUPLELIMITS结构的指针。

ptuplelimits 是在 Windows Server 2003 中引入的。

rgconditionalcolumn

JET_CONDITIONALCOLUMN结构的数组的可选参数,用于指定索引中的条件列。

cConditionalColumn

rgconditionalcolumn 数组中的结构计数。

犯 错

包含用于创建此索引的返回代码。

cbKeyMost

指定索引中键的最大允许大小(以字节为单位)。 如果未在 grbit 参数中指定JET_bitIndexKeyMost值,则忽略此参数。 如果此参数设置为零,并在 grbit 参数中指定了JET_bitIndexKeyMost,则调用函数将失败并JET_err_InvalidDef。

支持的最小最大密钥大小JET_cbKeyMostMin (255) ,这是旧版最大密钥大小。

最大密钥大小取决于数据库页大小 (JET_paramDatabasePageSize) ,如下所示:

  • 如果 JET_paramDatabasePageSize = 2048,则JET_cbKeyMostMin (255) <= cbKeyMost<= JET_cbKeyMost2KBytePage (500)

  • 如果 JET_paramDatabasePageSize = 4096,则JET_cbKeyMostMin (255) <= cbKeyMost<= JET_cbKeyMost4KBytePage (1000)

  • 如果 JET_paramDatabasePageSize = 8192,则JET_cbKeyMostMin (255) <= cbKeyMost<= JET_cbKeyMost8KBytePage (2000)

也可以从JET_paramKeyMost系统参数读取实例支持的最大密钥大小。

cbKeyMost 是在 Windows Vista 中引入的。

注解

ESE 支持对包含多个值的键列编制索引。 若要使用此功能,该列必须是 (JET_bitColumnTagged) 标记的列类型,并且必须标记为具有索引的多个值JET_bitColumnMultiValued。 在早于 Windows Vista 的 Windows 版本中,索引中只有第一个多值键列才会在索引中展开其值。 所有其他多值列和标记列只会在索引中展开其第一个值。

假设表中存在以下行 (列 Alpha 不是多值,而列 Beta、Gamma 和 Delta 是多值) ,并且索引创建为“+Alpha\0+Beta\0+Gamma\0+Delta\0\0\0”:

Alpha

Beta

Gamma

增量

1

ABC
GHI
JKL

MNO
PQR
斯图

VWX
YZ

2

THE


西班牙

IN
瀑布

下降的索引元组将存储:

{1,ABC,MNO,VWX}
{1,GHI,MNO,VWX}
{1,JKL,MNO,VWX}
{2,THE,RAIN,IN}

请注意,{2,THE,SPAIN,IN} 不会存储,即使第二行中的 Alpha 列恰好有一个多值。

在从 Windows Vista 开始的Windows版本中,可以通过指定JET_bitIndexCrossProduct在索引中扩展所有多值列。

要求

要求

客户端

需要 Windows Vista、Windows XP 或 Windows 2000 Professional。

Server

需要Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。

标头

在 Esent.h 中声明。

Unicode

JET_ INDEXCREATE_W ( Unicode ) 和 JET_ INDEXCREATE_A (ANSI) 实现。

另请参阅

JET_COLTYP
JET_CONDITIONALCOLUMN
JET_ERR
JET_GRBIT
JET_TABLECREATE
JET_TABLECREATE2
JET_TUPLELIMITS
JET_UNICODEINDEX
JetCreateIndex2
JetSetColumn
JetUpdate