如何使用PLSQL更新指定列的数据库表的行条目

问题描述 投票:1回答:2

我正在编写一个SQL脚本文件,当我将软件升级到更低版本到更高版本时运行。在较高版本的软件中,它们将是一些数据库模式更改(即删除一列并添加一个新列),到目前为止,关于更改数据库列并删除给定列我不会遇到任何问题精细。

但是假设如果我在较低版本并且我的列中保留了一些数据,这些数据将从更高版本的数据库中删除,并且新列添加到数据库表中,然后我想将现有数据保存到新列中在数据库中的前一列的某些条件下,通过循环每行数据库并检查某些条件的先前列数据,并根据其结果,我想将一些新数据填充到我在新版本中添加的新列中。

将现有数据保存到新列后,删除我要删除的列。

示例 - 假设我的较高版本数据库包含sequence_name,较低版本数据库表包含序列id.enter image description here

如何编写程序以保存存储在sequence_id中的数据,以根据对sequence_id值的某些检查将填充数据更新为sequence_name。

我已经为它编写了一个SQL程序,但它没有用,我的代码 -

BEGIN
FOR i IN SELECT sequence_id FROM v_live_view_screen_config LOOP    
IF i.sequence_id <> -1 THEN
  DECLARE @seqname VARCHAR(30);
  INSERT INTO @seqname SELECT sequence_name FROM v_sequence_details WHERE 
sequence_id = i.sequence_id;     
   UPDATE v_live_view_screen_config
     SET sequence_name = @seqname;
     WHERE sequence_id = i.sequence_id;
     END IF;        
 END LOOP;
END;

我也试过这个 -

create procedure findsequenceId()
begin
Declare cSequenceID varchar(30);
Declare cConfigID INT;
Declare cSequenceName varchar(30);
Declare done int default false;
Declare curSeq cursor for select configID,seqID from liveview;
declare continue handler for not found set done = true;
open curSeq;
loop_seq: loop
fetch curSeq into cSequenceId, cConfigID;
if done then
        leave loop_seq;
end if;

select cSequenceName = seqName from seqDetails as m where m.seqID = 
cSequenceID;
update liveview set seqName = cSequenceName where seqID = cSequenceID;
end loop;
close curSeq;
end;

请帮助我有点困惑,我的数据库服务器MySQl。谢谢!

c# mysql sql
2个回答
1
投票

尝试这样的事情 - UPDATE v_live_view_screen_config t2,(从v_sequence_details选择sequence_id,sequence_name)t1 SET t2.sequence_name = t1.sequence_name WHERE t1.sequence_id = t2.sequence_id;

可能这可行!


0
投票

我将提供概念性答案,但没有代码。您可以创建一个新表,其临时名称与您希望实现的新列结构相匹配。然后,对于旧表中的每一行,执行逻辑并插入新表。完成之后,您将拥有新表中的所有行,并且已经在您的列上执行了未插入的逻辑(即,您将所有值'Foo'的实例转换为'Bar',但直接插入所有其他值)。然后删除旧表并将新表重命名为旧表名。可能有一种更优雅的方式,但这是一个简单的暴力解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.