Postgresql

試圖了解如何使用 postgresql generate_series() 進行此操作

  • April 10, 2020

首先,我來自這個問題,建議我使用 generate_series() ,但是在我的數據庫中進行了一些調整後,我真的不明白如何創建這樣的句子這是老問題:填充一個應該有一個表X 行的預設值與大插入查詢?或者它可以預設以某種方式完成?

但我將再次改寫這個問題:

這些是我的初始表格

  • Users: id(int) PK,week_to_live(int)
  • Calendar: id(int) PK, user_id (int) (FK -> Users(id))*
  • CalendarField: id(int) PK, text(text), rating(int), calendar_id(int) (FK ->Calendar(id))*, week_number(int)

重點是,當我在我的應用程序中生成日曆時,實際上我的使用者和日曆表會正確填寫。在一代人之後,他們最終會看起來像這樣

users

id   weeks_to_live
1    3
2    2

calendar

id   user_id
1    1
2    2

那部分很好,但我也需要自動生成我的 CalendarField 表,這應該是 generate_series() 應該起作用的地方,所以它們最終看起來像這樣

CalendarField

id    text     rating    calendar_id   week_number
1     ''       0         1             0
2     ''       0         1             1
3     ''       0         1             2
4     ''       0         2             0
5     ''       0         2             1

如您所見:

  • id: 是自增的
  • text:始終預設為“”,
  • rating:始終預設為 0,
  • calendar_id(fk) : 是與每個日曆的關係,日曆欄位的行數等於 users 中最多 week_to_live 的數量
  • week_number: 這個數字,應該從 0 開始,並且當它 < 比 users 表中的 week_to_live 時保持遞增

現在我的問題是,如何生成最後一個插入,以便我的 CalendarField 表最終填充該資訊?我想通過生成系列,我不需要創建一個帶有 == week_to_live 值的巨大插入,以防它變得巨大。但我不明白該怎麼做。

還是我應該做一個巨大的插入呢?

您需要加入userscalendar然後使用generate_series().

insert into calendar_field (text, rating, calendar_id, week_number)
select '', 0, c.id, g.wn
from calendar c
 join users u on u.id = c.user_id
 cross join generate_series(0, u.weeks_to_live) as g(wn);

線上範例

引用自:https://dba.stackexchange.com/questions/264739