[英]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.