我正在编写一个 SQL 脚本文件,当我将一些较低版本的软件升级到较高版本时运行该脚本文件。在更高版本的软件中,它们将是一些数据库架构更改(即删除一列并添加一新列)现在到目前为止关于更改数据库列和删除给定列我没有遇到任何问题两者都有效美好的。但是假设如果我使用的是较低版本,并且我的列中保留了一些数据,这些数据将在较高版本的数据库中删除,并且新列被添加到数据库表中,那么我想将现有数据保存到基于新列的在数据库中前一列的特定条件下,通过循环数据库的每一行并检查前一列数据的某些条件,并根据其结果,我想将一些新数据填充到我在更高版本中添加的新列中。将现有数据保存到新列后,我将删除我想要删除的列。Eaxmple - 假设我的更高版本数据库包含 sequence_name和更低版本的数据库表包含 sequence_id。如何编写一个程序来保存存储在sequence_id中的数据,以根据对sequence_id值的一些检查将填充数据更新到sequence_name中。我已经为它编写了一个 SQL 程序,但它没有用,我的代码 -BEGINFOR 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()beginDeclare 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: loopfetch 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 回答

蓝山帝景
TA贡献1843条经验 获得超7个赞
我将提供一个概念性的答案,但没有代码。您可以使用与您希望实现的新列结构匹配的临时名称创建一个新表。然后,对于旧表中的每一行,执行您的逻辑并插入到新表中。完成后,您将在新表中拥有所有行,并在您的列上执行了并非只是插入的逻辑(即,您将值 'Foo' 的所有实例转换为 'Bar',但直接插入所有其他值)。然后删除旧表并将新表重命名为旧表名。可能有一种更优雅的方式来做到这一点,但这是一个简单的蛮力解决方案。

慕的地6264312
TA贡献1817条经验 获得超6个赞
尝试这样的事情 - UPDATE v_live_view_screen_config
t2 ,( select sequence_id,sequence_name from v_sequence_details
) t1 SET t2.sequence_name = t1.sequence_name WHERE t1.sequence_id = t2.sequence_id;
也许这可能有效!
- 2 回答
- 0 关注
- 279 浏览
添加回答
举报
0/150
提交
取消