Postgresql
為共享相同外鍵值的每組行創建唯一序列
在我的系統中,我希望每個使用者的**文章都有自己的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
列來確定排序順序。細節: