簡體   English   中英

在一個查詢中插入3個級別

[英]Insert 3 levels in one query

我有一個像這樣的Oracle數據結構:

俱樂部

Id
Name

俱樂部可以有很多球隊:

小組

Id
Name
ClubId

一個團隊可以有很多球員:

玩家

Id
Name
TeamId

如何在俱樂部和球員組成的俱樂部中插入內容? 如果這只是一個有團隊合作的俱樂部,我可以做:

Insert all 
into Clubs (Id, Name) Values (ClubIdSequence.nextval,'Manchester United')
into Teams (Name, ClubId) Values ('A-Team',ClubIdSequence.currval)
into Teams (Name, ClubId) Values ('B-Team',ClubIdSequence.currval)
Select * from dual

但是,如何插入播放器呢?

不起作用

Insert all 
into Clubs (Id, Name) Values (ClubIdSequence.nextval,'Manchester United')
into Teams (Id,Name, ClubId) Values (TeamIdSequence.nextval,'A-Team',ClubIdSequence.currval)
into Players (Name,Teamid) Values ('Michael Laudrup',TeamIdSequence.currval
into Teams (Id,Name, ClubId) Values (TeamIdSequence.nextval,'B-Team',ClubIdSequence.currval)
into Players (Name,Teamid) Values ('Brian Laudrup',TeamIdSequence.currval)
Select * from dual

因為

An UPDATE or INSERT statement attempted to insert a duplicate key.
        For Trusted Oracle configured in DBMS MAC mode, you may see
        this message if a duplicate entry exists at a different level

這是一條需要ClubIdSequence.nextval和TeamIdSequence.nextval的語句。 檢索這些值,然后執行該語句。 因此,您將獲得兩個具有相同ID的團隊。

使用第一個語句,您甚至可以交換currval和nextval:

Insert all 
into Clubs (Id, Name) Values (ClubIdSequence.currval,'Manchester United')
into Teams (Name, ClubId) Values ('A-Team',ClubIdSequence.nextval)
into Teams (Name, ClubId) Values ('B-Team',ClubIdSequence.currval)
Select * from dual

它仍然執行相同操作:執行nextval,然后使用currval進行插入。

當使用從序列中獲得的ID時,我強烈建議編寫插入前觸發器,以讀取適當序列的nextval並填充ID。 因此,insert語句的編寫者不必查找相應的序列,因此在選擇一個序列時不會出錯。 另外,可能有人會想編寫一個id = max(id)+ 1的插入語句,而忽略了甚至還有一個要使用的序列的事實。

使用觸發器后,只需在插入語句中省略ID。

但這仍然不能解決您的問題,因為您將不得不使用currval,即使在一個語句中使用了多次以上,它也會提供相同的值。 (足夠奇怪的是,它甚至可以在第一個插入語句之后為您提供當前值,即不會像預期的那樣在兩個插入之前的一個或在兩個插入之后的一個。)

因此,您最終遇到兩種情況:要么使用序列而不使用全部插入,要么使用全部插入而不使用序列。 他們只是相處不好。

這是不使用序列的解決方案:

Insert all 
  into Clubs (id, Name) Values (max_id + 1, 'Manchester United')
  into Teams (Name, ClubId) Values ('A-Team',max_id + 1)
  into Clubs (id, Name) Values (max_id + 2, 'Manchester Apart')
  into Teams (Name, ClubId) Values ('B-Team',max_id + 2)
Select nvl(max(id),0) max_id from clubs

將全部插入俱樂部(名稱)值(“曼徹斯特聯隊”)插入球隊(名稱,ClubId)值(“ A隊”,max_id + 1)插入俱樂部(名稱)值(“曼徹斯特公寓隊”)插入球隊(名稱, ClubId)值('B-Team',max_id + 2)從俱樂部中選擇max(id)max_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM