Coldfusion 如何增加每次插入和每次循环迭代的计数id?

Coldfusion 如何增加每次插入和每次循环迭代的计数id?,coldfusion,cfloop,Coldfusion,Cfloop,我有一个for循环,它应该为每个查询和每个循环迭代增加count_id。下面是我的代码示例: qryCode = queryExecute("SELECT max(display_order) AS maxdisplay FROM type_ref",{},{datasource: application.datasource}); // Result set of the query is: 58 qryItems = queryExecute("SELECT DISTINCT type_i

我有一个for循环,它应该为每个查询和每个循环迭代增加count_id。下面是我的代码示例:

qryCode = queryExecute("SELECT max(display_order) AS maxdisplay FROM type_ref",{},{datasource: application.datasource}); // Result set of the query is: 58 
qryItems = queryExecute("SELECT DISTINCT type_id, label, type_shortcode FROM types gtr WHERE item_id = :item_id",{item_id: {cfsqltype: "cf_sql_numeric",value: arguments.item_id}},{datasource: application.datasource}); 

// Result set of qryItems:
TYPE_ID  LABEL    TYPE_SHORTCODE
1        2012-1   HOA
2        2012-1   HOC
5        2012-1   HOR

local.display_count = qryCode.maxdisplay;

for ( row in qryItems ) {
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?) ";
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: display_count+1});
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?) ";
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: display_count+2});
    display_count++;
}

上面的代码将增加前两个值59和60,但对于第二次迭代,它将从60开始,而不是从61开始。代码应该产生count_id,其顺序为:59,60,61,62,63,64。qryItems中有三条记录。qryCode的最大值为58。第一次迭代中的第一个查询应该从58+1=59开始。下一个应该是58+2=60。在第二次迭代中,第一个count_id应该是61,依此类推。我不知道为什么我上面的代码从60开始第二次迭代,而不是从61开始。我有一行代码,它应该在每次迭代结束时增加count_id:display_count++

这是因为每次迭代要进行2次插入,因此应该将display_count增加2而不是1。所以你的for循环应该是这样的

for ( row in qryItems ) {
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?) ";
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: display_count+1});
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?) ";
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: display_count+2});
    display_count +=2;
}

这是因为每次迭代要进行2次插入,因此应该将display_count增加2,而不是1。所以你的for循环应该是这样的

for ( row in qryItems ) {
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?) ";
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: display_count+1});
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?) ";
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: display_count+2});
    display_count +=2;
}
怎么样

for ( row in qryItems ) {
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?),(?) ";

    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: ++display_count});
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: ++display_count});

}
另请参见:

怎么样

for ( row in qryItems ) {
    local.sqlInsert &= " INSERT INTO type_ref (display_order) VALUES (?),(?) ";

    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: ++display_count});
    qryParams.append({cfsqltype="CF_SQL_NUMERIC", value: ++display_count});

}

另请参见:

Edit-您也可以直接插入select max,而不是将其拉回到查询对象中。请记住,您的方法不是线程安全的。如果不锁定,多个请求在加载时可能会获得相同的订单值。。。如果这是你的应用程序的问题,请使用序列。另外,请使用事务,以便在发生错误时回滚所有插入。@Agreax I使用Sybase ASE和sequence不受支持。我想另一种选择是使用身份。这将使“显示顺序”列在每次插入新行时自动增加值。我同意在这种情况下应该使用事务处理。哦,我以为ASE支持他们?是的,如果表中还没有标识列,那么标识列就可以工作了。IIRC,每个表限制一个。@Agreax是的,支持标识。唯一的问题是,正如您所提到的,每个表只能有一个标识列。不,我的意思是我认为支持序列。编辑-您也可以直接插入select max,而不是将其拉回到查询对象中。请记住,您的方法不是线程安全的。如果不锁定,多个请求在加载时可能会获得相同的订单值。。。如果这是你的应用程序的问题,请使用序列。另外,请使用事务,以便在发生错误时回滚所有插入。@Agreax I使用Sybase ASE和sequence不受支持。我想另一种选择是使用身份。这将使“显示顺序”列在每次插入新行时自动增加值。我同意在这种情况下应该使用事务处理。哦,我以为ASE支持他们?是的,如果表中还没有标识列,那么标识列就可以工作了。IIRC,每个表限制一个。@Agreax是的,支持标识。唯一的问题是,正如您所提到的,每个表只能有一个标识列。不,我的意思是我认为序列是受支持的。