Postgresql

為共享相同外鍵值的每組行創建唯一序列

  • April 15, 2016

在我的系統中,我希望每個使用者的**文章都有自己的id序列。

因此,我創建了一個數據庫,該數據庫具有一個表,該表描述了users它們之間的對應關係articles。以下是此類表格的概要:

+------+----------+---------+
| 編號 | 文章 | 使用者 ID |
+------+----------+---------+
| 1 |一些筆記| 1 |
+------+----------+---------+
| 2 |一些筆記| 1 |
+------+----------+---------+
| 3 |一些筆記| 2 |
+------+----------+---------+
| 4 |一些筆記| 2 |
+------+----------+---------+
| 5 |一些筆記| 3 |
+------+----------+---------+

但我想通過ids以下方式在此表中生成:

+------+----------+---------+
| 編號 | 文章 | 使用者 ID |
+------+----------+---------+
| 1 |一些筆記| 1 |
+------+----------+---------+
| 2 |一些筆記| 1 |
+------+----------+---------+
| 1 |一些筆記| 2 |
+------+----------+---------+
| 2 |一些筆記| 2 |
+------+----------+---------+
| 3 |一些筆記| 2 |
+------+----------+---------+
| 1 |一些筆記| 3 |
+------+----------+---------+

因此,當user在關聯user表中創建一個新的時id,他的文章的序列將從1開始。

有沒有普遍接受的方法來解決這個問題?

這已經被問過很多次了。長與短:不要嘗試。您會遇到各種並發問題、刪除行引入的間隙等。創建id一個普通serial列並創建一個VIEW以顯示每個user_id.

CREATE VIEW v_user_article AS
SELECT *, row_number() OVER (PARTITION BY user_id ORDER BY id) AS per_user_id
FROM   user_article;

帶有“一些註釋”的列article對您的設置幾乎沒有意義。並且按它排序更沒有意義,因為數字會隨著每一篇沒有排在最後的新文章而改變。要獲得穩定的排序順序和穩定的數字(刪除除外!),請使用該serial列來確定排序順序。

細節:

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