【问题标题】:How to do an ets table lookup using a secondary key如何使用辅助键进行 ets 表查找
【发布时间】:2015-12-22 17:26:38
【问题描述】:

我有一个具有以下属性的表:

SortCode   Index  Created

SortCode 是主键,Index 是辅助键。给定一个Index 值,我如何获得关联的SortCode 值?

我试过ets:lookup/3,但它只需要一个主键。

【问题讨论】:

  • 您应该包含代码,以便我们可以看到您作为值放入表中的内容。不管怎样,看看ets:match functions
  • 您可以使用 ets:match/2 或 ets:select/2 来查找具有索引值的表条目,但是会导致读取表的每个条目,而 ets:lookup 的效率要低得多/2。你可以使用 mnesia 来实现你的表,你可以在一个表中维护多个索引,并使用 mnesia:index_read/3 来有效地查找二级索引。

标签: erlang mnesia erlang-shell ets


【解决方案1】:

ets 中没有二级索引。你可以这样做:

  1. 使用ets:matchets:select
  2. 进行全面扫描
  3. 让你自己的反向索引ets表或
  4. 使用 mnesia 添加(二级)索引。

【讨论】:

    【解决方案2】:

    补充 Hynek -Pichi- Vychodil 所说的话。

    在 ets 中没有解决方案来使用除了键之外的其他属性来获取记录。可以使用mnesia:dirty_index_read() 来完成。

    如果您只想使用 ets,则可以按照上述建议或以下代码进行操作。假设您的记录模式类似于:{"one",1,"27092015"} 键是“一”,但您必须使用 1 获取。

    FilterSuspCodeFun = fun ({_,I,_}) when I == 1 -> true ; (_) -> false end,
    ListData = ets:tab2list(susp_code),
    {SortCode,_,created}= lists:filter(FilterSuspCodeFun,ListData),
    

    【讨论】:

    • 如何做到ets:select(susp_code, [{{'_', 1, '_'}, [], ['$_']}]). 是非常低效的方法您可以使用ets:fun2ms(fun({_, 1, _} = R) -> R end). 生成匹配规范
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2015-01-11
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多