我正在编写一个sql脚本文件,当我将软件从较低版本升级到较高版本时会运行该文件。在更高版本的软件,他们将一些数据库模式的变化(即一列被删除,一个新的列被添加)现在到目前为止,关于改变数据库的列和删除给定列我不面临任何问题都很好。
但是假设我在较低版本,并且我的列中保留了一些数据,这些数据将从较高版本的数据库中删除,并且在数据库表中添加了一个新的列,然后,我想根据数据库中前一列的某些条件将现有数据保存到新列中,方法是循环数据库的每一行,检查前一列数据中的某些条件,并根据其结果将一些新数据填充到我的新列中,我在更高版本中添加了这些数据。
一旦我的现有数据被保存到新列,我就会删除我想删除的列。
eaxmple—假设我的高级vesrion数据库包含sequence\u name,而较低版本的数据库表包含sequence\u id。
如何编写一个程序来保存存储在sequence\u id中的数据,根据对sequence\u id值的一些检查将填充数据更新为sequence\u 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。谢谢你!
2条答案
按热度按时间j2datikz1#
尝试这样的操作-更新
v_live_view_screen_config
t2,(从v_sequence_details
)t1设置t2.sequence\u name=t1.sequence\u name,其中t1.sequence\u id=t2.sequence\u id;也许这可能有用!
hc8w905p2#
我将提供一个概念性的答案,但没有代码。您可以创建一个新表,其临时名称与您希望实现的新列结构相匹配。然后,对于旧表中的每一行,执行逻辑并插入到新表中。完成后,您的所有行都将位于新表中,并且逻辑已在您的列上执行,该列不仅被插入(即,您将值'foo'的所有示例转换为'bar',而且直接插入了所有其他值)。然后删除旧表并将新表重命名为旧表名。也许有一个更优雅的方法来做这件事,但这是一个简单的暴力解决方案。