[英]How to insert into two tables at the same time
我希望我能正确解释。 我需要将数据插入两个数据库表中。 此数据已存储在其他两个表中,但需要迁移。 为了简化起见,可以说这是我的源表:
具有列folderid,foldername的文件夹
与列linkid,url和folderid链接
我的目标表是:
new_folder,具有列folderid,foldername
new_link带有列linkid,url和folderid的列
也有其他专栏,但它们并不重要。 我的问题是,设置原始数据库的任何人都使用Java中的随机数生成器来创建文件夹和链接ID,而这些数字是完全垃圾。 需要用数据库中存在的序列生成的数字替换它们。
因此,我需要一个执行如下操作的语句:
insert into new_folder(folderid, foldername), new_link(linkid, url, folderid)
values (select seq_folder_id.nextval, foldername, seq_link_id.nextval, url, seq_folder_id.currval from folder, link where folder.folderid = link.folderid).
文件夹可能有多个链接。 文件夹表中有20万行,链接表中有10倍,因此我需要某种脚本来运行并拉出所有文件夹,并以新序列作为ID创建新条目。 单独这样做会很好,但是如果我这样做,那么一旦ID更改,我就无法将链接映射到文件夹,除非我在一个声明中这样做就行了。
这是有关多表插入的很好的教程:
http://www.oracle-developer.net/display.php?id=209
基本结构是:
INSERT ALL|FIRST
[WHEN condition THEN] INTO target [VALUES]
[WHEN condition THEN] INTO target [VALUES]
...
[ELSE] INTO target [VALUES]
SELECT ...
FROM source_query;
您可能需要重组源子查询以创建一列,该列指示每个文件夹名称的第一行,然后可以在when条件下将每个文件夹的每一行仅插入到文件夹表中,然后将所有行插入到链接表中。 您还必须重新设置如何生成ID,以便每个链接行都具有相同的folderID。 换句话说,您学习集合函数的时间!
示例:查看此查询,看看它是否可以帮助您解决(提示,folder_rank可以成为folder_id的基础,以及group_rank如何驱动when子句来确定文件夹插入)
select dense_rank() over (order by foldername) as folder_rank,
rank() over (parition by foldername order by url) as group_rank
, foldername
, seq_link_id.nextval
, url
from folder, link
where folder.folderid = link.folderid
或者,看一下在pl / sql而不是纯SQL中执行此操作:
declare
l_new_folder_id new_folder.folder_id%type;
begin
for folder_Rec in (select folder_id, foldername from folder)
loop
insert into new_folder (folder_id, folder_name)
values ( seq_folder_id.nextval, folder_Rec.folder_name)
returning folder_id into l_new_folder_id;
for link_rec in (select url from link where folder_id = folder_rec.folder_id)
insert into new_link (link_id, folder_id, url)
values (seq_link_id.nextval, l_new_folder_id, link_rec.url);
end loop;
end loop;
commit;
end;
有几种方法可以使这只猫变皮,对于初学者来说,复杂的SQL可能不是最佳选择。 另外,检查您的源数据-如果您的文件夹没有任何链接,那么如果要插入无链接文件夹,则纯SQL方法也必须合并外部联接,而不是当前定义。 PL / Sql解决方案已经可以解决这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.