我正在编写一个SQL脚本文件,当我将软件从较低版本升级到较高版本时运行。在更高版本的软件中,到目前为止,它们将对数据库架构进行一些更改(即删除一列并添加一个新列),到目前为止,有关更改数据库列和删除给定列的问题,我都不会遇到任何问题,两者均有效很好。
但是假设如果我使用的是较低版本,并且我的列中保留了一些数据,这些数据将以较高版本从数据库中删除,并且将新列添加到数据库表中,那么我想将现有数据保存到通过循环数据库的每一行并检查某些条件下的前一列数据,并根据数据库中前一列的特定条件创建新列,并根据其结果,我想将一些新数据填充到我在新列中添加了更高版本的数据。 / p>
将现有数据保存到新列后,我将要删除的列删除。
Eaxmple-假设我的较高版本数据库包含sequence_name ,而较低版本数据库表包含sequence_id 。
如何编写程序来保存存储在 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。 谢谢!
答案 0 :(得分:1)
尝试类似的方法-
更新v_live_view_screen_config
t2,(选择
v_sequence_details
中的sequence_id,sequence_name
)t1设置t2.sequence_name = t1.sequence_name在哪里
t1.sequence_id = t2.sequence_id;
也许这可能有用!
答案 1 :(得分:0)
我将提供一个概念性的答案,但没有代码。您可以使用与您希望实现的新列结构相匹配的临时名称创建一个新表。然后,对于旧表中的每一行,执行您的逻辑并将其插入新表中。一旦完成,您将在新表中拥有所有行,并且逻辑不是在您刚刚插入的列上执行的(即,您将所有值'Foo'的实例转换为'Bar',而是直接插入所有其他值)。然后删除旧表,并将新表重命名为旧表名。可能有一种更优雅的方法,但这是一个简单的蛮力解决方案。