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 = ?