簡體   English   中英

Elixir Phoenix - 在 null 上強制唯一性

[英]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.

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