Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 选择和更新多个值的更好解决方案_Java_Mysql_Database Design - Fatal编程技术网

Java 选择和更新多个值的更好解决方案

Java 选择和更新多个值的更好解决方案,java,mysql,database-design,Java,Mysql,Database Design,我想根据不同的情况更新列中的一些值。。。。。 该表包含以下详细信息,如 Date date period int subcode varchar(3) status_bits varchar(100) // st

我想根据不同的情况更新列中的一些值。。。。。 该表包含以下详细信息,如

                    Date               date
                    period             int
                    subcode            varchar(3)
                    status_bits        varchar(100)
                    // status bits resemble an information based code based...the data usually stored are  2343211 where each value in digits represent an information.....
现在我必须根据不同的日期和时期更新这些值。。。。 现在考虑一下
java程序

我已经在java中的相应变量中存储了详细信息,如

                   java.util.Date date[];
                   int period[];
                   String subcode[];

                   // Here for an index i , they share the same values within a row.....
如果我想以这样一种方式更新它,我想更改varchar中不同日期、时段和子代码(组合)的第5个字母。。。。。 现在..我现在已经这样表演了

     Connection con;
     preparedStatement ps;
     String bitstatus;



     for(i=0; i < noofupdates; i++)
     {
           ps = con.prepareStatement("select status_bits from tablename where Date = ? AND period = ? AND subcode = ? limit 0,1");
           ps.setDate(1,date[i]);
           ps.setInt(2,period[i])'
           ps.setString(3,subcode[i]);

           rs=ps.executeQuery();
           while(rs.next())
           {

                 bitstatus = rs.getString(1);
                 // performed operation to update the bit.....
                 ps=con.prepareStatment("update status_bits correspondind to the same date,field and subcode");

                 ps.executeUpdate();
           }

     }
连接con;
编制报表;
字符串位状态;
对于(i=0;i

现在我假设您从程序中了解到,我想根据不同的日期和期间更新表中的状态位,其中位操作很常见。…现在我真的知道,这些方法正在处理大量查询,并严重影响mysql性能…因此,请提供一个替代性的想法来帮助我到目前为止,大约有1000条记录需要更新

首先从数据库中读取一些数据(状态位),然后根据检索到的记录数多次调用多个数据库

相反,为什么不编写一个存储过程,将日期、周期和子代码作为参数,并在SP本身中执行整个逻辑


这样,您只需要1 DB调用。

如果您知道要将状态位字符串的第5位设置为给定(日期、周期、子代码)的特定值,您可以避免选择,只需执行更新

更新:为了正确处理“状态_位”列中的现有值小于4个字符的情况,我们希望确保替换第5个字符,而不是现有字符串只有1个字符长的第2个字符。我们可以使用CASE表达式进行测试。当我们至少有4个字符时,我们可以在前四个字符之后附加(所需的)第五个字符。否则,我们需要将现有字符串“填充”为4个字符,然后再追加(所需的)第5个字符。(以前,该语句只包含用于长度至少为4个字符的现有字符串的表达式。)

(如果不想更新所有匹配行,可以添加LIMIT子句,但如果要更新所有匹配行,则不需要添加LIMIT子句。如果
(日期、句点、子代码)
是唯一的,则最多匹配一行。)

还可以根据其他条件设置状态_位的第5位,例如,通过向where子句添加谓词,或在集合中添加大小写表达式(或IF函数)

UPDATE tablename
   SET status_bits = CONCAT(LEFT(status_bits,4)
                     , IF(SUBSTR(status_bits,1,1 = '1', ?, SUBSTR(status_bits,5,1))
                     , SUBSTR(status_bits,6))
 WHERE `Date` = ? AND period = ? AND subcode = ? 
相当于:

UPDATE tablename
   SET status_bits = CONCAT(LEFT(status_bits,4), ?, SUBSTR(status_bits,6))
 WHERE `Date` = ? AND period = ? AND subcode = ? 
   AND SUBSTR(status_bits,1,1) = '1'
这种方法将把您正在运行的查询数量减少一半(减少到数据库的往返次数),并避免您必须返回整个
status\u位

(不幸的是,替换varchar列的第5个字符的SQL文本有点笨拙,因为MySQL没有SQL Server提供的更紧凑的
STUFF
功能。)


更新:需要更复杂的表达式来处理现有状态(长度小于4个字符的字符串…)

注意:在该SQL语句中,需要在两个单独的位置参数中提供要放置在第5位置的字符的值


注意:

实际上。。。我正在选择与日期、周期和子代码(复合)对应的状态位,如果我得到一个值,我将执行位操作并将其更新到包含该日期、周期和子代码的同一行<代码>如果你真的认为这可以通过一个查询来完成Cud u plz提供一个示例…因为这就是我想要的…您正在执行什么位操作?我在你的代码中看不到它?
它只是替换字符串中的一个字符
…我没有包括它,因为它是编程部分……现在真正的问题是发出了大量的查询……
我真的很想知道如何使用最少的查询数量来实现这一点……
!!不知道问题出在哪里。REPLACE是一个SQL函数,可用于在SQL代码中替换字符串中的字符。很酷…但是你认为…这会影响性能吗…因为…这就像我们应用字符串函数…rite…不,对性能影响不大。您最大的性能问题是在
(日期、期间、子代码)
(或其他合适的索引)上有一个可用的索引。工作量实际上大致相同,定位行并替换status_bits列。实际上,在数据库端这样做会更快,而不是返回整个status_bits字符串并将其发送回。您的意思是为日期、句点和子代码使用单个主键…?…是这样吗…?这不一定是您的主键。为了提高性能,您只需要一个索引,其中至少有一些列作为前导索引,最好是先选择最有选择性的列。如果这些列的组合是唯一的,您可以创建一个唯一的键。嗯..我已经将这3列组合成主键,子代码引用到另一个主键中..这样好吗
UPDATE tablename
   SET status_bits = CONCAT(LEFT(status_bits,4), ?, SUBSTR(status_bits,6))
 WHERE `Date` = ? AND period = ? AND subcode = ? 
   AND SUBSTR(status_bits,1,1) = '1'
UPDATE tablename
   SET status_bits = 
       CASE WHEN CHAR_LENGTH(status_bits) >= 4
            THEN CONCAT(LEFT(status_bits,4), ? , SUBSTR(status_bits,6))
            ELSE CONCAT(RPAD(status_bits,4,' '), ? )
       END
 WHERE `Date` = ? AND period = ? AND subcode = ?