[英]Elixir Phoenix - enforce uniqueness on null
我有一組事件,有一個日期。 日期僅給出全天(例如 2022-08-06)。 為了在一天內跟蹤事件的順序,我為每個事件保留了一個previous_event_id
鍵,以便我可以創建一個鏈接列表。 當我在特定日期創建第一個事件時,它的previous_event_id
將為 NULL。
所以我的數據庫中的一組事件可能看起來像這樣:
ID | 日期 | previous_event_id |
---|---|---|
1 | 2022-01-01 | NULL |
2 | 2022-01-01 | 1 |
3 | 2022-01-01 | 2 |
4 | 2022-01-02 | NULL |
5 | 2022-01-02 | 4 |
6 | 2022-01-02 | 5 |
7 | 2022-01-03 | NULL |
現在,我想強制每天只有一個事件可以具有 NULL 值。 這甚至可能嗎?如果可以,我該怎么做? 我的 model 中有以下代碼,但唯一約束允許多個 NULL 值。
def changeset(event, attrs) do
event
|> cast(attrs, [
:name,
:date,
:previous_event_id
])
|> unique_constraint([:previous_event_id, :date])
|> validate_required([
:name,
:date,
])
end
我考慮使用 -1 而不是 NULL,但是(當不是 NULL / -1 時)它也是一個參考,所以我會在 -1 不是現有事件 ID 時出現驗證錯誤。
那么,我如何(如果有的話)強制一個表只有一個 NULL 行? (或者,在這種情況下,每個日期只有一個 NULL 行)。
從 elixirforum 上的@benwilson512 得到這個答案,這滿足了我的用例。 將其放在這里以供將來參考:
您可以通過創建具有 where 子句的“部分索引”來做到這一點:
create index(:events, [:date], where: "previous_event_id is null", unique: true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.