JET_INDEXCREATE 结构
适用于: Windows |Windows Server
JET_INDEXCREATE 结构包含基于可扩展存储引擎 (ESE) 数据库中的数据创建索引所需的信息。 结构由 JetCreateIndex2 等函数以及 JET_TABLECREATE 和 JET_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-specifier><column-name>”,其中 direction-specification 为“+”或“-”。 例如,“+abc\0-def\0+ghi\0” 的 szKey 将按升序) (三列“abc”编制索引,“def” (以降序) () 。 在 C 语言中,字符串文本具有隐含 的 NULL 终止符;因此,上述字符串将以双 NULL 终止。
szKey 中指定的列数不能超过 JET_ccolKeyMost 的值, (依赖于版本的常量) 。
在 szKey 中必须至少命名一个列。
过时行为:在双 NULL 终止符之后,可以 (WORD 指定语言 ID,该语言 ID 将传递到 MAKELCID ( langid,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 结构。 无需JET_bitIndexUnicode即可为 Unicode 数据编制索引。 它仅用于自定义 Unicode 数据的规范化。 |
JET_bitIndexTuples |
指定索引是元组索引。 有关元组索引的说明 ,请参阅JET_TUPLELIMITS 。 windows XP 操作系统中引入了JET_bitIndexTuples。 |
JET_bitIndexTupleLimits |
指定此标志会影响结构中 cbVarSegMac/ptuplelimits 联合字段的解释。 设置此位意味着 ptuplelimits 字段实际上指向 JET_TUPLELIMITS 结构,以允许自定义元组索引限制 (意味着JET_bitIndexTuples) 。 JET_bitIndexTupleLimits是在 Windows Server 2003 操作系统中引入的。 |
JET_bitIndexCrossProduct 0x00004000 |
为具有多个键列(多值列)的索引指定此标志将导致为这些键列中所有值的交叉乘积的每个结果创建索引条目。 否则,索引对于作为多值列的最重要键列中的每个多值只有一个条目,并且每个索引条目都将使用多值列的任何其他键列的第一个多值。 例如,如果为具有值“red”和“blue”的列 A 上的索引指定了此标志,而列 B 上具有值“1”和“2”,则会创建以下索引条目:“red”、“1”;“red”、“2”;“blue”、“1”;“blue”、“2”。 否则,将创建以下索引条目:“red”、“1”;“blue”、“1”。 windows Vista 操作系统中引入了JET_bitIndexCrossProduct。 |
JET_bitIndexKeyMost 0x00008000 |
指定此标志将导致索引使用结构中 cbKeyMost 字段中指定的最大键大小。 否则,索引将使用 JET_cbKeyMost (255) 作为其最大密钥大小。 windows Vista 中引入了JET_bitIndexKeyMost。 |
JET_bitIndexDisallowTruncation 0x00010000 |
指定此标志将导致索引的任何更新,导致截断的键失败并JET_errKeyTruncated。 否则,键将以无提示方式截断。 有关密钥截断的详细信息,请参阅 JetMakeKey 函数。 Windows Vista:Windows Vista 中引入了JET_bitIndexDisallowTruncation。 |
JET_bitIndexNestedTable 0x00020000 |
指定此标志将导致在多个多值列上更新索引,但仅使用相同 itagSequence 的值。 windows Vista 中引入了JET_bitIndexNestedTable。 |
ulDensity
初始索引 B+ 树的百分比密度。 指定小于 100 的数字最初会占用更多空间来创建索引,但允许索引的未来增长到位,从而避免内部碎片。
lcid
未在 grbit 参数中指定JET_bitIndexUnicode值时,在规范化数据时, (LCID) 区域设置标识符。 如果索引位于 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 数组中的结构计数。
err
包含用于创建此索引的返回代码。
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”:
Alpha |
Beta |
Gamma |
增量 |
---|---|---|---|
1 |
ABC |
MNO |
VWX |
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。 |
服务器 |
需要 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