【问题标题】:How to generate id by AUTO_INCREMENT in ETS?ETS中如何通过AUTO_INCREMENT生成id?
【发布时间】:2023-01-13 12:42:00
【问题描述】:

我试图为 ets 编写一个包装器,您可以使用它来读取和写入 etc 中的结构,问题是:如何使 id 自动生成

  defmodule StructTable do
     defstruct  id: 0, data: nil

     def create_table do
       :ets.new(__MODULE__, [:orderedset, :named_table, {:keypos, 1}])
     end

     def insert_into_table(%__MODULE__{ id: id, data: data}) do
       if hd(:ets.lookup(__MODULE__, id)) == false do
          :ets.insert(__MODULE__, {id,data})
         else IO.puts("already exists")
       end
     end

     def select_data(iid) do
       hd(:ets.lookup(__MODULE__, iid))
     end

     def select_all do
       :ets.tab2list(__MODULE__)
     end

  end

【问题讨论】:

  • 您是否尝试过将当前索引号存储在不同的 ETS 表中并进行更新?你看过hex.pm/packages/pockets吗?

标签: database insert elixir structure ets


【解决方案1】:

我使用 Ets.last() 获取最后一个密钥并向其添加一个;如果它是一个空表,它的 id 为 1。我使用了 ets v0.1.2。表类型为ordered_set,对键进行排序。

defmodule StructTable do
 defstruct id: 0, data: nil

def create_table do
  :ets.new(__MODULE__, [:ordered_set, :public, :named_table])
end

def insert_into_table(%__MODULE__{data: data}) do
  :ets.insert(__MODULE__, {generate_id(), data})
end

def select_all do
  :ets.tab2list(__MODULE__)
end

def generate_id() do
  if :ets.tab2list(__MODULE__) == [] do
    1
  else
    (Ets.last(__MODULE__) |> elem(1)) + 1
  end
end

def select_data(iid) do
  hd(:ets.lookup(__MODULE__, iid))
end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多