精华内容
下载资源
问答
  • oncheck 常用命令

    2021-05-29 22:04:26
    在 Informix 中,oncheck 命令可以检查和打印数据对象。例如: oncheck -cr 可以检查数据库保留页的正确性 oncheck -cD <databaseName>:<tableName> 可以检查数据的正确性 oncheck -cI <database...

    在 Informix 中,oncheck 命令可以检查和打印数据对象。例如:

    1. oncheck -cr 可以检查数据库保留页的正确性
    2. oncheck -cD <databaseName>:<tableName> 可以检查数据的正确性
    3. oncheck -cI <databaseName>:<tableName>#<indexName> 可以检查索引的正确性
    4. oncheck -pe <dbsName> 可以打印某个 dbspace 中所有 extent 的分布情况
    5. oncheck -pP <chunkNum> <startPageNum> <numOfPages> 可以打印指定的数据页 ,第三个参数用的少
    6. oncheck -pT <databaseName>:<tableName> 可以打印“某个数据表以及其上的索引”的磁盘使用情况,用的也不多
    展开全文
  • 本文将通过 oncheck 命令来展示实际的 Informix 索引结构,为您揭晓这个问题的答案。 Informix 索引简介 在 Informix 中,一个数据表里可能有很多数据行(row)。例如某连锁超市的“客户基本信息”数据表里有...

    引言

    在 Informix 中,可以通过索引来快速定位“需要使用的数据行”。那么一般的 Informix 索引是通过什么结构来实现“快速定位数据行”的目的呢?本文将通过 oncheck 命令来展示实际的 Informix 索引结构,为您揭晓这个问题的答案。

    Informix 索引简介

    在 Informix 中,一个数据表里可能有很多数据行(row)。例如某连锁超市的“客户基本信息”数据表里有 7 百万个数据行(即 7 百万个客户的基本信息)。Informix 收到超市工作人员输入的“某个客户的客户号”后,需要快速的向超市工作人员返回“这个客户的姓名、邮箱、住址等信息”。如果 Informix 收到“某个客户的客户号”后,把“客户基本信息”数据表的 7 百万个数据行从前往后一行一行顺序扫描,那么 Informix 将无法快速返回结果。如何才能达到“快速返回结果”的目的呢?答案是使用 Informix 索引。Informix 索引就像是中文字典里的拼音目录。拼音目录里记录了每个拼音和对应的页码,Informix 索引里记录了每个特征值(例如每个客户的客户号)和对应的数据行地址。通过拼音目录可以快速的得到某个拼音对应的页码,通过 Informix 索引可以快速的得到某个特征值(例如某个客户的客户号)对应的数据行地址。

    在 Informix 中一般的索引是通过 B+ 树这种数据结构来实现的。B+ 树是一种树结构,它的每个节点可以有多个分叉。B+ 树可以是 1 层或多层。在 B+ 树中,所有的叶节点都在同一层,即不会出现类似这样的情况:在一棵 B+ 树中,有的叶节点在第 2 层,有的叶节点在第 3 层。关于 B+ 树的详细叙述请参看 Wikipedia 上关于 B+ 树的内容。B+ 树的结构如图 1 所示。

    图 1. 图 1. B+ 树的结构

    B+ 树的结构

    图 1 中的 B+ 树一共有 3 层:第 1 层是根节点,第 2 层是分支节点,第 3 层是叶节点。节点里有多个节点项 (entry),每个节点项由键 (key) 和值 (value) 组成。节点项的键一般为整数、字符串或“ ‘元素是整数或字符串’ 的集合”。在图 1 的节点中,节点项的键为整数。节点项的值 (value) 一般为指针。在非叶节点中,节点项的值指向子节点。在叶节点中,节点项的值为空指针或指向具体数据的指针。在图 1 的叶节点中,节点项的值指向数据行。一般情况下,每个节点还有两个指针,分别指向“前一个兄弟节点”和“后一个兄弟节点”。

    Informix 索引对应的 B+ 树一般是 2 层、3 层或 4 层。

    在 Informix 索引对应的 B+ 树中,1 个节点是 1 个页 (page)。

    oncheck 命令的简介

    在 Informix 中,oncheck 命令可以检查和打印数据对象。例如:

    1. oncheck -cr 可以检查数据库保留页的正确性
    2. oncheck -cD <databaseName>:<tableName> 可以检查数据的正确性
    3. oncheck -cI <databaseName>:<tableName>#<indexName> 可以检查索引的正确性
    4. oncheck -pe <dbsName> 可以打印某个 dbspace 中所有 extent 的分布情况
    5. oncheck -pP <chunkNum> <startPageNum> <numOfPages> 可以打印指定的数据页
    6. oncheck -pT <databaseName>:<tableName> 可以打印“某个数据表以及其上的索引”的磁盘使用情况

    关于 oncheck 命令的详细叙述请参看 Informix Information Center 中关于 oncheck 的内容

    准备工作

    本文通过一个例子来讲述“如何通过 oncheck 命令来展示 Informix 索引结构”。通过以下步骤来创建这个例子所需的数据对象:

    (1)首先通过如下的 SQL 语句在名为 dbs1 的 dbspace 中创建数据库 db1:

    1

    create database db1 in dbs1 with log;

    (2)然后使用如下的 SQL 语句在 db1 中创建数据表、加载数据、创建索引:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    create table employee (

     employeenum int,

     deptnum int,

     profnum int,

     band int,

     name char(10),

     description varchar(200)

    );

     

    create procedure employeeProc()                                     

    define my_employeenum integer;

    define my_deptnum integer;

    define my_profnum integer;

    define my_band integer;

    define my_name char(10);

    define my_description varchar(200);

     

    let my_profnum = 1;

    let my_band = 0;

     

    for my_employeenum = 1 to 60000

     

    let my_deptnum = my_employeenum / 5 + 1;

     

    let my_band = my_band + 1;

    if (my_band = 51) then

     let my_band = 1;

     let my_profnum = my_profnum + 1;

    end if;

     

    let my_name = 'name' || my_employeenum;

    let my_description = 'Description of employee ' || my_employeenum ||

                        ': she/he is an excellent employee.';

     

    insert into employee values

    (my_employeenum, my_deptnum, my_profnum, my_band, my_name, my_description);

     

    end for;

     

    end procedure;

     

    call employeeProc();

     

    create unique index idx1 on employee ( employeenum );

    create index idx2 on employee ( deptnum );

    create unique index idx3 on employee ( profnum, band );

    上面的 SQL 语句创建了名为 employee 的数据表,该数据表有 6 个数据列:employeenum 是员工号,deptnum 是部门号,profnum 是职业种类号,band 是职业等级,name 是员工姓名,description 是对员工的描述。上面的 SQL 语句使用存储过程 employeeProc 往数据表 employee 中插入了 60000 行实验数据。这 60000 行实验数据如表 1 所示。

    表 1. 表1. 数据表 employee 中的数据的示例

    employeenumdeptnumprofnumbandnamedescription
    1111name1Description of employee 1: she/he is an excellent employee.
    2112name2Description of employee 2: she/he is an excellent employee.
    3113name3Description of employee 3: she/he is an excellent employee.
    4114name4Description of employee 4: she/he is an excellent employee.
    5215name5Description of employee 5: she/he is an excellent employee.
    6216name6Description of employee 6: she/he is an excellent employee.
    ............... ...... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
    6000012001120050name60000Description of employee 60000: she/he is an excellent employee.

    (若要查看全部 60000 行实验数据,请参看文件 employee.txt。文件 employee.txt 被包含在附件“Informix 索引结构 .zip”中。)

    在数据表 employee 上有 3 个索引:idx1、idx2、idx3。idx1 是单列唯一索引(single-column unique index)。idx2 是单列非唯一索引(single-column non-unique index)。idx3 是多列唯一索引(multi-column unique index)。“单列”意味着索引是建在 1 个数据列上。“多列”意味着索引是建在多个数据列上。“唯一”是指任意两个数据行的索引键不能相同,例如对于唯一索引 idx1,任意两个数据行的 employeenum 不能相同。“非唯一”是指两个数据行的索引键可以相同。

    单列唯一索引的结构

    我们先来关注单列唯一索引 idx1。如何查看 idx1 的内部结构呢?答案是使用 oncheck 命令。我们使用 oncheck -pT 来查看 idx1 的层次,使用 oncheck -pP 来查看 idx1 的所有节点的内容,具体操作如下(这些 oncheck 命令的语法请参看前文的“oncheck 命令的简介”这一章):

    1. 使用如下命令将“数据表 employee 以及其上的索引”的磁盘使用情况输出到文件 pT.out 中:

      1

      oncheck -pT db1:employee > pT.out

      (文件 pT.out 被包含在附件“Informix 索引结构 .zip”中)

    2. 使用如下命令将 dbs1(dbs1 是“employee、idx1、idx2、idx3”所在的 dbspace)中所有 extent 的信息输出到文件 pe.out 中:

      1

      oncheck -pe dbs1 > pe.out

      (文件 pe.out 被包含在附件“Informix 索引结构 .zip”中)

    3. 在文件 pe.out 中,可以看到如下信息:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      ... ...

      ... ...

      Chunk  Pathname                        Pagesize(k)  Size(p)  Used(p)  Free(p)

      10     /opt/ts/dbs/dbs1                     2       500000   6015     493985

       

      Description                                                   Offset(p)  Size(p)

      ... ...

      ... ...  

      db1:'informix'.idx1                                               4607     512

      ... ...

      ... ...

      这说明索引 idx1 由一个 extent 组成 ( 一个 extent 是一组物理上连续的页 ),idx1 所在的 chunk 的 chunk 号是 10,idx1 的起始页在 chunk 内的页地址为 4607,idx1 的总页数为 512。(chunk 号和 chunk 内的页地址组成物理页地址,所以 idx1 的起始页的物理页地址是 10:4607。)于是我们使用如下命令将 idx1 的内容输出到文件 idx1.out 中:

      1

      oncheck -pP 10 4607 512 > idx1.out

      (文件 idx1.out 被包含在附件“Informix 索引结构 .zip”中)

    idx1 的层次

    从 pT.out 文件中,我们可以看到 idx1 的层次结构如下:

    1

    2

    3

    4

    5

    6

    7

    8

                    Average    Average

    Level    Total No. Keys Free Bytes

    ----- -------- -------- ----------

        1        1        3       1988

        2        3      144        293

        3      432      138        214

    ----- -------- -------- ----------

    Total      436      138        219

    idx1 共有 3 层:第 1 层有 1 个节点,该节点是 idx1 的根节点,该节点有 3 个索引项;第 2 层有 3 个节点,这些节点是 idx1 的分支节点,平均每个分支节点有 144 个索引项;第 3 层有 432 个节点,这些节点是 idx1 的叶节点,平均每个叶节点有 138 个索引项。

    idx1 的根节点

    在文件 idx1.out 中一共有 512 个页。其中哪一页是 idx1 的根节点呢?

    在索引中,逻辑页地址为 0 的页(即起始页)是空白页,逻辑页地址为 1 的页是根节点。(一个页的逻辑页地址表示:从起始页(即第 0 页)算起,该页在逻辑上是第几页。)

    如果 idx1 由一个 extent 组成 ( 一个 extent 是一组物理上连续的页 ),那么“页地址转换公式”如下:

    1

    2

    当 1 个索引是由 1 个 extent 组成时的页地址转换公式:

        索引节点的物理页地址 = 索引的起始页的物理页地址 + 索引节点的逻辑页地址

    由于 idx1 的起始页的物理页地址为 10:4607(请参看本章“单列唯一索引的结构”的开头部分),idx1 的根节点的逻辑页地址为 1,所以 idx1 的根节点的物理页地址为 10:4608。

    在文件 idx1.out 中,可以看到物理页地址为 10:4608 的页(即 idx1 的根节点)的内容如图 2 所示。

    图 2. 图 2. idx1 的根节点的内容

    idx1 的根节点的内容

    在图 2 中,1 个 slot 是 1 个索引项。idx1 的根节点有 3 个 slot,因此 idx1 的根节点有 3 个索引项。第 1 个索引项的键 (key) 为 0x51fd,值 (value) 为 0x3,这说明“第 1 个索引项指向的索引页”的逻辑页地址为 0x3,也就是说“根节点的第 1 个子节点”的逻辑页地址为 0x3。第 2 个索引项的键 (key) 为 0xa3fa,值 (value) 为 0x9c,这说明“第 2 个索引项指向的索引页”的逻辑页地址为 0x9c,也就是说“根节点的第 2 个子节点”的逻辑页地址为 0x9c。第 3 个索引项由于是根节点的最后一个索引项,所以没有键 (key),只有值 (value)。第 3 个索引项的值 (value) 为 0x134,这说明“第 3 个索引项指向的索引页”的逻辑页地址为 0x134,也就是说“根节点的第 3 个子节点”的逻辑页地址为 0x134。

    在图 2 的右上部分,可以看到 next 和 prev。next 表示后一个兄弟节点的逻辑页地址,next 的值为 0 表示没有后一个兄弟节点;prev 表示前一个兄弟节点的逻辑页地址,prev 的值为 0 表示没有前一个兄弟节点。由于根节点没有兄弟节点,所以在根节点中 next 的值和 prev 的值都为 0。

    idx1 的分支节点

    在 idx1 的第 2 层有 3 个分支节点。这 3 个分支节点是 idx1 的根节点的子节点。

    下面我们以 idx1 的第 1 个分支节点(即根节点的第 1 个子节点,为叙述方便,下文简称为分支节点 B)为例来讲述 idx1 的分支节点。

    在上一节中,我们已经知道分支节点 B(即根节点的第 1 个子节点)的逻辑页地址为 0x3,根据上一节提到的“页地址转换公式”,可以得知分支节点 B 的物理页地址为 10:4610。

    在文件 idx1.out 中,可以看到物理页地址为 10:4610 的页(即分支节点 B)的内容如下所示:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    addr             stamp    chksum nslots flag type         frptr frcnt next     prev

    10:4610          110571078 3ad9   151    850  BTREE        1232  208   9c       0    

        slot ptr   len   flg

        1    24    8     0 

        2    32    8     0 

        3    40    8     0 

        4    48    8     0 

        5    56    8     0 

        6    64    8     0 

        7    72    8     0

        ... ...

        ... ...

        150  1216  8     0 

        151  1224  8     0 

    slot   1:

       0: 80  0  0 8b  0  0  0  2                           ................

    slot   2:

       0: 80  0  1 16  0  0  0  4                           ................

    slot   3:

       0: 80  0  1 a1  0  0  0  5                           ...!............

    slot   4:

       0: 80  0  2 2c  0  0  0  6                           ...,............

    slot   5:

       0: 80  0  2 b7  0  0  0  7                           ...7............

    slot   6:

       0: 80  0  3 42  0  0  0  8                           ...B............

    slot   7:

       0: 80  0  3 cd  0  0  0  9                           ...M............

    ... ...

    ... ...

    slot 150:

       0: 80  0 51 72  0  0  0 98                           ..Qr............

    slot 151:

       0: 80  0 51 fd  0  0  0 99                           ..Q}............

    从上面的分支节点 B 的内容中,可以看到分支节点 B 一共有 151 个索引项(即 151 个 slot)。每个索引项都有键 (key) 和值 (value),索引项的值指向一个叶节点。例如:第 1 个索引项的键 (key) 为 0x8b,值 (value) 为 0x2,这说明“第 1 个索引项指向的索引页”的逻辑页地址为 0x2,也就是说“分支节点 B 的第 1 个子节点”的逻辑页地址为 0x2;第 151 个索引项的键 (key) 为 0x51fd,值 (value) 为 0x99,这说明“第 151 个索引项指向的索引页”的逻辑页地址为 0x99,也就是说“分支节点 B 的第 151 个子节点”的逻辑页地址为 0x99。

    从上面的分支节点 B 的内容中,还可以看到:next 的值为 9c,prev 的值为 0。这表明分支节点 B 的下一个兄弟节点的逻辑页地址为 0x9c,分支节点 B 没有上一个兄弟节点。

    “idx1 的其它分支节点”与分支节点 B 的结构相同。

    idx1 的叶节点

    在 idx1 的第 3 层有 432 个叶节点。这 432 个叶节点是 idx1 的分支节点的子节点。

    下面我们以 idx1 的第 1 个叶节点(即分支节点 B 的第 1 个子节点,为叙述方便,下文简称为叶节点 L)为例来讲述 idx1 的叶节点。

    在上一节中,我们已经知道叶节点 L(即分支节点 B 的第 1 个子节点)的逻辑页地址为 0x2,根据“idx1 的根节点”这一节提到的“页地址转换公式”,可以得知叶节点 L 的物理页地址为 10:4609。

    在文件 idx1.out 中,可以看到物理页地址为 10:4609 的页(即叶节点 L)的内容如下所示:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    addr             stamp    chksum nslots flag type         frptr frcnt next     prev

    10:4609          110570306 3fde   139    890  BTREE        1275  213   4        0    

        slot ptr   len   flg

        1    24    9     0 

        2    33    9     0 

        3    42    9     0 

        4    51    9     0 

        5    60    9     0 

        6    69    9     0 

        7    78    9     0

        ... ...

        ... ...

        138  1257  9     0 

        139  1266  9     0 

    slot   1:

       0: 80  0  0  1  0  0  1  1  0                        ................

    slot   2:

       0: 80  0  0  2  0  0  1  2  0                        ................

    slot   3:

       0: 80  0  0  3  0  0  1  3  0                        ................

    slot   4:

       0: 80  0  0  4  0  0  1  4  0                        ................

    slot   5:

       0: 80  0  0  5  0  0  1  5  0                        ................

    slot   6:

       0: 80  0  0  6  0  0  1  6  0                        ................

    slot   7:

       0: 80  0  0  7  0  0  1  7  0                        ................

    ... ...

    ... ...

    slot 138:

       0: 80  0  0 8a  0  0  7 12  0                        ................

    slot 139:

       0: 80  0  0 8b  0  0  7 13  0                        ................

    从上面的叶节点 L 的内容中,可以看到叶节点 L 一共有 139 个索引项(即 139 个 slot)。每个索引项都有键 (key) 和值 (value),索引项的值指向一个数据行。例如:第 1 个索引项的键 (key) 为 0x1,值 (value) 为 0x101,这说明“第 1 个索引项指向的数据行”的 ROWID(数据行 ID)为 0x101;第 139 个索引项的键 (key) 为 0x8b,值 (value) 为 0x713,这说明“第 139 个索引项指向的数据行”的 ROWID(数据行 ID)为 0x713。

    从上面的叶节点 L 的内容中,还可以看到:next 的值为 4,prev 的值为 0。这表明叶节点 L 的下一个兄弟节点的逻辑页地址为 0x4,叶节点 L 没有上一个兄弟节点。

    “idx1 的其它叶节点”与叶节点 L 的结构相同。

    idx1 结构的示意图

    根据 idx1 的各节点的内容,可以得出 idx1 的结构如图 3 所示。

    图 3. 图 3. 单列唯一索引 idx1 的结构

    单列唯一索引 idx1 的结构

    单列非唯一索引的结构

    单列非唯一索引和单列唯一索引在内部结构上的区别主要是叶节点:在单列非唯一索引的叶节点中,每个索引项包含 1 个键 (key) 和“1 或多个值 (value)”;在单列唯一索引的叶节点中,每个索引项包含 1 个键 (key) 和“1 个值 (value)”。

    下面以“单列非唯一索引 idx2 的第 1 个叶节点”为例来说明单列非唯一索引的叶节点。

    idx2 的第 1 个叶节点的内容如下(获取“idx2 的第 1 个叶节点的内容”的过程与获取“idx1 的第 1 个叶节点的内容”的过程相似):

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    addr             stamp    chksum nslots flag type         frptr frcnt next     prev

    10:5121          110573127 24db   55     890  BTREE        1614  210   4        0      

        slot ptr   len   flg

        1    24    24    0 

        2    48    29    0 

        3    77    29    0 

        4    106   29    0 

        5    135   29    0 

        6    164   29    0 

        7    193   29    0

        ... ...    

        ... ...

        54   1556  29    0 

        55   1585  29    0 

    slot   1:

       0: 80  0  0  1  0  0  1  1  0  0  0  1  2  0  0  0   ................

      16:  1  3  0  0  0  1  4  0                           ................

    slot   2:

       0: 80  0  0  2  0  0  1  5  0  0  0  1  6  0  0  0   ................

      16:  1  7  0  0  0  1  8  0  0  0  1  9  0            ................

    slot   3:

       0: 80  0  0  3  0  0  1  a  0  0  0  1  b  0  0  0   ................

      16:  1  c  0  0  0  1  d  0  0  0  1  e  0            ................

    slot   4:

       0: 80  0  0  4  0  0  1  f  0  0  0  1 10  0  0  0   ................

      16:  1 11  0  0  0  1 12  0  0  0  1 13  0            ................

    slot   5:

       0: 80  0  0  5  0  0  1 14  0  0  0  2  1  0  0  0   ................

      16:  2  2  0  0  0  2  3  0  0  0  2  4  0            ................

    slot   6:

       0: 80  0  0  6  0  0  2  5  0  0  0  2  6  0  0  0   ................

      16:  2  7  0  0  0  2  8  0  0  0  2  9  0            ................

    slot   7:

       0: 80  0  0  7  0  0  2  a  0  0  0  2  b  0  0  0   ................

      16:  2  c  0  0  0  2  d  0  0  0  2  e  0            ................

    ... ...

    ... ...

    slot  54:

       0: 80  0  0 36  0  0  e  5  0  0  0  e  6  0  0  0   ...6............

      16:  e  7  0  0  0  e  8  0  0  0  e  9  0            ................

    slot  55:

       0: 80  0  0 37  0  0  e  a  0  0  0  e  b  0  0  0   ...7............

      16:  e  c  0  0  0  e  d  0  0  0  e  e  0            ................

    从 idx2 的第 1 个叶节点的内容中,可以看到该叶节点一共有 55 个索引项。每个索引项都有 1 个键 (key) 和多个值 (value)。例如:第 1 个索引项的键 (key) 为 0x1,多个值 (value) 分别为 0x101、0x102、0x103、0x104,这说明“第 1 个索引项”指向 4 个数据行,这 4 个数据行的 ROWID(数据行 ID)分别为 0x101、0x102、0x103、0x104;第 55 个索引项的键 (key) 为 0x37,多个值 (value) 分别为 0xe0a、0xe0b、0xe0c、0xe0d、0xe0e,这说明“第 55 个索引项”指向 5 个数据行,这 5 个数据行的 ROWID(数据行 ID)分别为 0xe0a、0xe0b、0xe0c、0xe0d、0xe0e。

    idx2 的其它节点的内容请参看文件 idx2.out(文件 idx2.out 被包含在附件“Informix 索引结构 .zip”中)。

    根据 idx2 的各节点的内容,可以得出 idx2 的结构如图 4 所示。

    图 4. 图 4. 单列非唯一索引 idx2 的结构

    单列非唯一索引 idx2 的结构

    多列唯一索引的结构

    多列唯一索引和单列唯一索引在内部结构上的区别主要是:在多列唯一索引的节点中,索引项的键 (key) 由多个数据列构成;在单列唯一索引的节点中,索引项的键 (key) 由 1 个数据列构成。

    下面以“多列唯一索引 idx3 的第 1 个叶节点”为例来说明多列唯一索引的节点。

    idx3 的第 1 个叶节点的内容如下(获取“idx3 的第 1 个叶节点的内容”的过程与获取“idx1 的第 1 个叶节点的内容”的过程相似):

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    addr             stamp    chksum nslots flag type         frptr frcnt next     prev

    10:5377          110574370 28be   106    890  BTREE        1402  218   4        0      

        slot ptr   len   flg

        1    24    13    0 

        2    37    13    0 

        3    50    13    0 

        4    63    13    0 

        5    76    13    0 

        6    89    13    0 

        7    102   13    0 

        ... ...

        ... ...

        105  1376  13    0 

        106  1389  13    0 

    slot   1:

       0: 80  0  0  1 80  0  0  1  0  0  1  1  0            ................

    slot   2:

       0: 80  0  0  1 80  0  0  2  0  0  1  2  0            ................

    slot   3:

       0: 80  0  0  1 80  0  0  3  0  0  1  3  0            ................

    slot   4:

       0: 80  0  0  1 80  0  0  4  0  0  1  4  0            ................

    slot   5:

       0: 80  0  0  1 80  0  0  5  0  0  1  5  0            ................

    slot   6:

       0: 80  0  0  1 80  0  0  6  0  0  1  6  0            ................

    slot   7:

       0: 80  0  0  1 80  0  0  7  0  0  1  7  0            ................

    ... ...

    ... ...

    slot 105:

       0: 80  0  0  3 80  0  0  5  0  0  6  5  0            ................

    slot 106:

       0: 80  0  0  3 80  0  0  6  0  0  6  6  0            ................

    从 idx3 的第 1 个叶节点的内容中,可以看到该叶节点一共有 106 个索引项。每个索引项都有 1 个键 (key) 和 1 个值 (value),索引项的键由两个数据列构成。例如:第 1 个索引项的键 (key) 为(0x1,0x1),值 (value) 为 0x101;第 106 个索引项的键 (key) 为(0x3,0x6),值 (value) 为 0x606。

    idx3 的其它节点的内容请参看文件 idx3.out(文件 idx3.out 被包含在附件“Informix 索引结构 .zip”中)。

    根据 idx3 的各节点的内容,可以得出 idx3 的结构如图 5 所示。

    图 5. 图 5. 多列唯一索引 idx3 的结构

    多列唯一索引 idx3 的结构

    3 种 Informix 索引在内部结构上的特点

    从前面的叙述中,可以知道 3 种 Informix 索引在内部结构上的特点如表 2 所示。

    表 2. 表 2. 3 种 Informix 索引在内部结构上的特点

    索引种类特点
    单列唯一索引在节点中,索引项的键 (key) 由 1 个数据列构成 ;
    在节点中,每个索引项有 1 个值 (value)。
    单列非唯一索引在节点中,索引项的键 (key) 由 1 个数据列构成;
    在非叶节点中,每个索引项有 1 个值 (value);
    在叶节点中,每个索引项有 1 个或多个值 (value)。
    多列唯一索引在节点中,索引项的键 (key) 由多个数据列构成;
    在节点中,每个索引项有 1 个值 (value)。

    一些说明

    下面是对本文的一些说明:

    1. 在本文叙述的索引中,索引项都是不跨页的。索引项跨页(即索引项 E 的一部分在页 P1,索引项 E 的另一部分在页 P2 上)的情况较少,也较复杂,不在本文的叙述范围内。
    2. 多列非唯一索引兼具“多列”和“非唯一”的特点:在节点中,索引项的键 (key) 由多个数据列构成;在非叶节点中,每个索引项有 1 个值 (value); 在叶节点中,每个索引项有 1 个或多个值 (value)。由于篇幅限制,本文不对“多列非唯一索引”进行详细叙述。
    3. 1 个索引在物理存储上可以由 1 个或多个 extent 组成。extent 的个数不影响索引的逻辑结构。为使叙述更加简明,本文叙述的每个示例索引在物理存储上都由 1 个 extent 组成。
    4. 在一般的索引中,1 个索引只有 1 个根节点。在 Informix 11.70 中新推出的 Forest-Of-Trees 类型的索引中,1 个索引可以有多个根节点。
    5. 在一般的索引中,Informix 使用 B+ 树作为索引的内部结构。在一些特殊的索引中,Informix 可能使用其它数据结构作为索引的内部结构。例如在处理空间数据 (spatial data) 时,Informix 使用了 R-Tree 作为索引的内部结构。这些特殊的索引结构不在本文的叙述范围内。

    结束语

    本文叙述了 3 种 Informix 索引的内部结构,使读者对 Informix 索引的层次、根节点、分支节点、叶节点等有较深的理解。

    读者理解 Informix 索引的内部结构后,可以更好的设计 Informix 索引,较大的提升 Informix 数据库和 Informix 应用程序的性能。

    转自https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1208xiey/

    展开全文
  • ztree实现复选框功能、级联选中,并且子节点选中时,父节点自动... "p", "N": "p" },autoCheckTrigger: true},该check配置有个问题,子节点每次选中时,父节点都会触发onCheck事件,导致父节点会多次向后台发送请求。

      ztree实现复选框功能,并且子节点选中时,父节点自动选中,子节点取消选中(若所有子节点都没有选中)则父节点也会自动取消选中,check配置如下:

    	check: {
    		enable: true,
    		chkStyle: "checkbox",
    		chkboxType: { "Y": "p", "N": "p" },
    		autoCheckTrigger: true
    	},
    

      但是,该check配置有个问题,子节点每次选中时,都会触发父节点的onCheck事件,假设每次选中的时候都会往后台发送请求,则父节点onCheck会发送很多无用的请求,如下图所示:
    在这里插入图片描述  显然,点击“应用管理”子菜单时,“权限管理”父菜单会触发onCheck事件,并向后台发送请求是合理的(设置角色、菜单关联关系)。但是,当点击角色管理时,父菜单再次触发onCheck事件,并向后台发送请求就不合理啦,因为父菜单与角色已经设置了关联关系,那么该如何解决呢?

    2个方案:
    1)修改兵器,改造ztree组件,子节点选中时(如果父节点已经选中),父节点不再触发onCheck事件;
    2)修改onCheck事件的逻辑处理,增加节点是否已选中判断,如果是则不再向后台发送请求

    因为是第三方组件,修改组件有技术风险,并影响后续版本升级,既然修改兵器可可行,就只能修改onCheck事件,减少请求发送次数。本案onCheck如下:

    	var is_add = treeNode.checked == true ? 'Y' : 'N';
    	if(treeNode.is_add == is_add) return;
    	request({m:"setRoleMenu", is_add: is_add, role_id: role_id, mnu_id: treeNode.mnu_id},
    	            function (data, textStatus){
    					if (data.flag) {
    						console.log(treeNode);
    						treeNode.is_add = is_add;
    						var zTree = $.fn.zTree.getZTreeObj("tree-menus");
    						zTree.updateNode(treeNode);
    					}
    	            }
    	);
    

    父节点第一次选中时,treeNode.is_add会设置为Y;后续子节点选中时,父节点仍然会触发onCheck事件,在onCheck事件中判断treeNode.is_add == ‘Y’,若条件成立则不再发送请求到后台,具体代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Ztree父节点onCheck多次触发问题处理</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/zTree.v3/3.5.23/css/metroStyle/metroStyle.min.css">
        <link rel="stylesheet" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
    	<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" />
    	<script src="https://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    	<script src="https://cdn.bootcss.com/zTree.v3/3.5.23/js/jquery.ztree.all.min.js"></script>
    	<style>
    		.pr{position: relative;}
    		.pa{position: absolute;}
    		#btn-reload{right: 10px; top: 5px}
    	</style>
    </head>
    <body>
    	<div class="page-content container" style="margin-top: 30px; overflow-x: hidden;">
    		<div class="panel panel-default">
    			<div class="panel-heading pr">
    				<h3 class="panel-title">autoCheckTrigger=true,父节点会多次触发onCheck处理</h3>
    				<button type="button" class="btn btn-sm btn-default pa" id="btn-reload" onclick="refreshTree()">重新加载数据</button>
    			</div>
    			<ul id="tree-menus" class="ztree oy-auto" data-height="auto"></ul>
    		</div>
    	</div>
    </body>
    <script type="text/javascript">
    	var role_id = "12122122";
    	var setting = {
    			 view: {
    				selectedMulti: false
    			}, 
    			check: {
    				enable: true,
    				chkStyle: "checkbox",
    				chkboxType: { "Y": "p", "N": "p" },
    				autoCheckTrigger: true
    			},
    			data: {
    				simpleData: {
    					enable: true,
    					idKey:"mnu_id",
    					pIdKey:"parent_id"
    				}
    			},
    			callback: {
    				beforeCheck: beforeCheck,
    				onCheck: onCheck
    			}
    	};
    	function onCheck(event, treeId, treeNode) {
    		var is_add = treeNode.checked == true ? 'Y' : 'N';
    		if(treeNode.is_add == is_add) return;
    		request({m:"setRoleMenu", is_add: is_add, role_id: role_id, mnu_id: treeNode.mnu_id},
    	            function (data, textStatus){
    					if (data.flag) {
    						console.log(treeNode);
    						treeNode.is_add = is_add;
    						var zTree = $.fn.zTree.getZTreeObj("tree-menus");
    						zTree.updateNode(treeNode);
    					}
    	            }
    	        );
    	}
    	function beforeCheck(treeId, treeNode){}
    	
    	function request(para, cb) {
    		cb({flag: true});
    	}
    	
    	function refreshTree() {
    		var data = [
    			{"parent_name":null,"mnu_id":"jreuvft7vvoi","is_add":"N","mnu_name":"菜单管理","role_id":null,"parent_id":"jreuu0bd6qva","name":"菜单管理","checked":"false","is_leaf":"N","sid":778},
    			{"parent_name":null,"mnu_id":"jreuu0bd6qva","is_add":"N","mnu_name":"权限管理","role_id":null,"parent_id":"0","name":"权限管理","checked":"false","is_leaf":"Y","sid":776},
    			{"parent_name":null,"mnu_id":"jrhg7ut6d2xl","is_add":"N","mnu_name":"应用管理","role_id":null,"parent_id":"jreuu0bd6qva","name":"应用管理","checked":"false","is_leaf":"Y","sid":777},
    			{"parent_name":null,"mnu_id":"sa_role_manage","is_add":"N","mnu_name":"角色管理","role_id":null,"parent_id":"jreuu0bd6qva","name":"角色管理","checked":"false","is_leaf":"Y","sid":779},
    			{"parent_name":null,"mnu_id":"js6vtxe2c0hi","is_add":"N","mnu_name":"租户管理","role_id":null,"parent_id":"0","name":"租户管理","checked":"false","is_leaf":"N","sid":1328},
    			{"parent_name":null,"mnu_id":"js6vvc64inpo","is_add":"N","mnu_name":"租户管理","role_id":null,"parent_id":"js6vtxe2c0hi","name":"租户管理","checked":"false","is_leaf":"Y","sid":1329},
    			{"parent_name":null,"mnu_id":"jw8w0q21vrrl","is_add":"N","mnu_name":"租户角色管理","role_id":null,"parent_id":"jw8vzsuxfme8","name":"租户角色管理","checked":"false","is_leaf":"Y","sid":1352},
    			{"parent_name":null,"mnu_id":"jw8vzsuxfme8","is_add":"N","mnu_name":"租户私有权限","role_id":null,"parent_id":"js6vtxe2c0hi","name":"租户私有权限","checked":"false","is_leaf":"N","sid":1351},
    			{"parent_name":null,"mnu_id":"jrerqdum0grz","is_add":"Y","mnu_name":"系统管理","role_id":"jrh5w478zfap","parent_id":"0","name":"系统管理","checked":"true","is_leaf":"N","sid":775},
    			{"parent_name":null,"mnu_id":"js5tn7hnqwbi","is_add":"N","mnu_name":"字典表配置","role_id":null,"parent_id":"jrerqdum0grz","name":"字典表配置","checked":"false","is_leaf":"Y","sid":1327},
    			{"parent_name":null,"mnu_id":"jwepaz466ndr","is_add":"N","mnu_name":"用户角色关联","role_id":null,"parent_id":"jweal92lb2j1","name":"用户角色关联","checked":"false","is_leaf":"Y","sid":1379},
    			{"parent_name":null,"mnu_id":"jrhdg2cv8xxm","is_add":"N","mnu_name":"角色菜单绑定","role_id":null,"parent_id":"jreuu0bd6qva","name":"角色菜单绑定","checked":"false","is_leaf":"Y","sid":786},
    			{"parent_name":null,"mnu_id":"jwacj4pfbwsf","is_add":"N","mnu_name":"租户菜单管理","role_id":null,"parent_id":"jw8vzsuxfme8","name":"租户菜单管理","checked":"false","is_leaf":"Y","sid":1353},
    			{"parent_name":null,"mnu_id":"jsbetipzoyxg","is_add":"Y","mnu_name":"系统编码维护","role_id":"jrh5w478zfap","parent_id":"jrerqdum0grz","name":"系统编码维护","checked":"true","is_leaf":"Y","sid":1330},
    			{"parent_name":null,"mnu_id":"jsmk4tu7djxj","is_add":"N","mnu_name":"系统TAG维护","role_id":null,"parent_id":"jrerqdum0grz","name":"系统TAG维护","checked":"false","is_leaf":"Y","sid":1334},
    			{"parent_name":null,"mnu_id":"jsg65i8yiwzk","is_add":"N","mnu_name":"操作日志查看","role_id":null,"parent_id":"jrerqdum0grz","name":"操作日志查看","checked":"false","is_leaf":"Y","sid":1333},
    			{"parent_name":null,"mnu_id":"jsfm8nma4npt","is_add":"N","mnu_name":"错误日志跟踪","role_id":null,"parent_id":"jrerqdum0grz","name":"错误日志跟踪","checked":"false","is_leaf":"Y","sid":1332},
    			{"parent_name":null,"mnu_id":"jweal92lb2j1","is_add":"N","mnu_name":"用户管理","role_id":null,"parent_id":"jreuu0bd6qva","name":"用户管理","checked":"false","is_leaf":"N","sid":1378}];
    		
    		$.fn.zTree.destroy("tree-menus");
    		$.fn.zTree.init($("#tree-menus"), setting, data);
    	}
    	
    	$(function(){
    		$("#tree-menus").height($(window).height() - 100);
    		refreshTree()
    	})
    </script> 
    </html>
    
    展开全文
  •  onCheck: function (row, $element) {<!-- -->  if (row.TYPE == "营业执照") {<!-- -->  Judge++;  if (($("input[name='MasterCopyType']:...
  •  row.TYPE是数据库里的值,Judge是定义的全局变量怎么使用onCheck函数来取消选中的行的CheckBox <code class="language-javascript">function BusinessLicenseVerify() { var oTableInitPersonnel = new ...
  • onCheck: zTreeOnCheck }, //获取数据 async : { enable : true, //设置启用异步加载 contentType : "application/json", //定义ajax提交参数的参数类型,一般为json...

    1,entity类(也可用map集合)

    package com.books.entity;
    /**
    	 * ztree实体类
    	 * @return
    	 */
    public class ztreeMenu {
    	
    	private String id; //节点id
    	private String pId; //父节点id
    	private String name; //节点名
    	private String checked; //复选框,是否选择(true、false)
    	private String open; //节点是否展开(true、false)
    	//还可以添加其他属性 如:URL等
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getpId() {
    		return pId;
    	}
    	public void setpId(String pId) {
    		this.pId = pId;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getChecked() {
    		return checked;
    	}
    	public void setChecked(String checked) {
    		this.checked = checked;
    	}
    	public String getOpen() {
    		return open;
    	}
    	public void setOpen(String open) {
    		this.open = open;
    	}
    	
    	@Override
    	public String toString() {
    		return "ztreeMenu [id=" + id + ", pId=" + pId + ", name=" + name + ", checked=" + checked + ", open=" + open + "]";
    	}
    	
    
    }
    

    2,dao

    /**
    	 * ztree菜单数据--普通方法+实体类
    	 * @return
    	 */
    	public List<ztreeMenu> selzTreeMenu(){
    		List<ztreeMenu> list=new ArrayList<>();
    		try {
    			String sql=" select MENUBID as id,PARENTBID as pId,MENUBNAME as name,Root as checked,open from t_books_menu where Extend1 like 'root' ";
    			Connection con=DBAccess.getConnection();
    			PreparedStatement ps = con.prepareStatement(sql);
    			ResultSet rs=ps.executeQuery();
    			ztreeMenu zm=null;
    			while(rs.next()) {
    				zm=new ztreeMenu();
    				zm.setId(rs.getString("id")); //节点id
    				zm.setpId(rs.getString("pId")); //节点父id
    				zm.setName(rs.getString("name")); //节点名
    				zm.setChecked(rs.getString("checked")); //复选框,是否选择(true、false)
    				zm.setOpen(rs.getString("open")); //节点是否展开(true、false)
    				list.add(zm);
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return list;
    	}
    

    3,Action

    /**
    	 * 展示数据的方法--ztree
    	 * @param req
    	 * @param resp
    	 * @return
    	 */
    	public String zTreeRootList(HttpServletRequest req, HttpServletResponse resp) {
    		try {
    			List<ztreeMenu> rootList = rd.selzTreeMenu();
    			ObjectMapper om = new ObjectMapper();
    			ResponseUtil.write(resp, om.writeValueAsString(rootList));
    		} catch (JsonProcessingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return "null";
    	}
    

    4,js

    //-------------------------------------ztree树形菜单展示权限数据-------------------------------------------
    					
    		     //setting:zTree的参数配置
    			 var setting = {
    					 view: {
    						    selectedMulti: true, //设置是否能够同时选中多个节点
    						    showIcon: true,  //设置是否显示节点图标
    						    showLine: true,  //设置是否显示节点与节点之间的连线
    						    showTitle: true,  //设置是否显示节点的title提示信息
    						   },
    						   data: {
    						     simpleData: {
    						     enable: true, //设置是否启用简单数据格式(zTree支持标准数据格式跟简单数据格式,上面例子中是标准数据格式)
    						      idKey: "id",  //设置启用简单数据格式时id对应的属性名称
    						      pidKey: "pId" //设置启用简单数据格式时parentId对应的属性名称,ztree根据id及pId层级关系构建树结构
    						    }
    						   },
    						   check:{
    						    enable: true,  //设置是否显示checkbox复选框
    						    chkStyle: "checkbox",
    							chkboxType: { "N": "ps", "Y": "ps" },//子节点(s),父节点(p);('Y','N'是否选中)
    						    autoCheckTrigger: true,
    						   },
    						   callback: {
    							    onClick: function(treeId, treeNode) {
    									var treeObj = $.fn.zTree.getZTreeObj(treeNode);//拿到zTree对象
    									var selectedNode = treeObj.getSelectedNodes()[0];//拿到被选择的第一个节点对象
    									alert("权限:"+selectedNode.name+"; 是否授权:"+selectedNode.root);
    								   },    //定义节点单击事件回调函数
    						         onCheck: zTreeOnCheck
    							   },
    						   //获取数据
    						   async : {
    								enable : true, //设置启用异步加载
    								contentType : "application/json", //定义ajax提交参数的参数类型,一般为json格式
    								dataType : "text", //数据类型
    								url : rUrl+'/userAction.action?methodName=zTreeRootList', //请求路径
    								dataFilter : ajaxDataFilter //返回数据(不能直接用,需要打印)
    						}
    								   
    			 };
    					 
    			// 打印数据库加载的数据
    			function ajaxDataFilter(treeId, parentNode, responseData) {
    					if (responseData) {
    						console.log(responseData);
    					}
    					return responseData;
    				};
    						
    			 $.fn.zTree.init($("#zTreeBookRoot"), setting); //加载数据				
    					
    			         }
    		
    		    }]
    	
    	});
    	
        //用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数
    	//修改权限
    	function zTreeOnCheck(event, treeId, treeNode) {
    		
    //		if(treeNode.checked==false){
    //			alert(treeNode.name + ", 权限已撤销!" );
    //		}else{
    //			alert(treeNode.name + ", 授权成功!" );
    //		}
    	    
    	    $.ajax({
    			   url:rUrl+'/userAction.action?methodName=setRoot&&MenuBid='+treeNode.id+'&&Root='+treeNode.checked,
    			  });
    	    
    	};
    

    5,jsp 展示

         <div>
          <ul id="zTreeBookRoot" class="ztree"></ul>
         </div>
    

    6,ztree插件导入–见
    ztree插件导入

    展开全文
  • 如下图所示,点击框选中,...      思路:点击事件是onClick,勾选的回调函数为onCheck,要实现上面需求,我们只需要在callback里新增一个点击事件 代码如下: callback: { onClick: onTreeClick ...
  • check: { enable: true, autoCheckTrigger: true, chkboxType: { "Y": "ps", "N": "ps" } } autoCheckTrigger 设置true 即可
  • 代码如下: $(“.tree-checkbox”, tree).unbind(“.tree”).bind(“click.tree”, function() { if ($(this).hasClass(“tree-checkbox0”)) { $(this).removeClass(“tree-checkbox0”).addClass(“tree-checkbox1...
  • easyui tree诡异的触发oncheck事件

    千次阅读 2018-03-01 18:34:49
    如图,左边是一颗easyui树,右边是生成的,但是触发右边复选框的时候会触发tree的onCheck事件后来发现是因为生成右边的列表的时候使用了左边tree的id,所以造成了这种情况解决方案:将id加一个前缀或者后缀...
  • Oncheck 打印页面信息

    2019-10-17 09:41:43
    Oncheck –pP chunk_number page_offset 注意:offset是从0开始的,即offset 2 指第三个页 Oncheck –pP 1 0 就可以显示第一个chunk的第1个页; Oncheck -pp partition_number logical_page_number Oncheck –pp...
  • 用一个temp去存储将要触发oncheck()的节点对象, 然后再在oncheck()方法中判断触发这个方法的是不是你当前所勾选的节点,如果不是就直接pass,这样一来,下面的刷新页面方法就不会因为父子联动而多次触发了, 页面的...
  • elect tn.dbsname, tn.tabname, ti.* from systabinfo ti, systabnames tn where ti.ti_partnum=tn.partnum and tn.dbsname='ttdb1' and tn.tabname='t1'
  • 需求:  有一棵这样的树,点击... 第一想法就是取消级联检查自己实现oncheck事件啊。。。但是,要初始化勾选的时候,发现进入了死循环或者总是达不到满意的效果。。。。 解决办法:  oncheck事件正常实现,在初始化
  •   ... onCheck:未勾选不会触发onCheck,check是开始的一列checkbox。   之前我还一直不知道是怎么搞的,还以为是我的环境配置问题,浏览器的问题!现在问题终于解决了!  
  • jquery判断checked的三种方法: .attr('checked): //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false .prop('checked'): //16+:true/false .is(':checked'): //所有版本:true/false//别忘记冒号...
  • 参考http://bbs.csdn.net/topics/391116087中3楼代码,对onCheck事件设置标志位,控制递归的开始和结束 var flag = 1;//控制递归标志位 $('#tree').tree({ url : sy.contextPath + '/base/syorganization!...
  • 我在树中使用checkbox,通过onCheck事件来修改数据库来记录是否节点被选中过,但发现在读取节点信息时被选中过的节点加载时仍然触发了onCheck事件,这样导致在加载过程中做了数据库操作。 有没有什么方法让我在加载...
  • OnCheck事件传非数字型参数OnCheck点击没有反应 代码均为测试代码,上代码: <title></title> <script src="/Scripts/jquery-3.4.1.min.js"></script> <script type="text/...
  • 问题:在一个页面使用了两个zTree,用选项卡区分,现在要点击节点展示相应的子节点,... 解决方案: 1 function onCheck(e, treeId, treeNode) { 2 console.log(treeId); 3 //清空所有已选人员 4 $("#...
  • } } //搜索完成勾选某个 隐藏搜索ul显示主ul并勾选触发主tree的onCheck事件 //手动触发onCheck事件至关重要 这个也找了很久 //当它触发了onCheck事件,那么上面的treenodeClick方法就可以找到他的父级了。...
  • 转载于:https://www.cnblogs.com/jaic-xiao/archive/2009/03/13/Ti_Jiao_An_Niu_OnCheck_Zhi_Hou_De_Ji_Qiao.html
  • informix实用程序- oncheck

    千次阅读 2006-11-05 13:59:00
    oncheck 检查、修复、显示 根据命令的选项,oncheck有以下功能 1、检查数据库的一致性 2、修复不一致的索引 3、显示数据库信息 oncheck只能修复索引带来的不一致性,
  • oncheck事件更新表

    2010-12-03 14:20:43
    <p>I have a simple question here. I need to UPDATE a row table by selecting a check-box in my page, what is the quickl way to do that? Ajax? ...If someone know, I will be very grateful!...
  • INFORMIX--oncheck

    千次阅读 2010-07-01 15:54:00
    oncheck 检查、修复、显示 <br />根据命令的选项,oncheck有以下功能 1、检查数据库的一致性 2、修复不一致的索引 3、显示数据库信息 oncheck只能修复索引带来的不一致性,对数据表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,020
精华内容 1,208
关键字:

onCheck