美文网首页
[eos8]智能合约开发-非主索引(附属索引)

[eos8]智能合约开发-非主索引(附属索引)

作者: FriendOfTime | 来源:发表于2020-02-02 00:10 被阅读0次

https://developers.eos.io/welcome/latest/getting-started/smart-contract-development/secondary-indices

开发者官网最近进行了更新,内容布局更加合理了。

secondary indices:附属索引,或者叫非主索引(纯个人翻译)。也就是除了primary index之外的其他索引。目前eos可以支持最多16个索引。

其实也就是类似关系数据库的索引,通过附属索引,可以快速对table进行排序或者查找。

流程参考官网即可,这里主要总结需要注意的点:

1、增加一列或者索引之前需要删除现有的数据

可以先通过这个命令查询当前数据:

然后再通过此命令删除:

问题:这简直是致命的啊,不明白为啥有这样的要求。还不如重新建一个multi-index table,在生产环境真有这么做的吗?有懂的可以留言讲解下

2、为multi-index table增加附属索引

语法:

typedef eosio::multi_index<"people"_n, person,indexed_by<"byage"_n, const_mem_fun<person, uint64_t, &person::get_secondary_1>>

  > address_index;

说明:

1)第三个参数indexed_by用于初始化一个索引

2)索引名字:byage

3)indexed_by的第三个参数是一个函数适配器(函数对象),用于指定作用于该索引上的排序方法

3、测试

注意:

--index 2表示使用附属索引查询。(Here the --index 2 parameter is used to indicate that the query applies to the secondary index)

问题:如果有多个附属索引如何显示?

4、附代码

#include <eosio/eosio.hpp>

#include <eosio/print.hpp>

using namespace eosio;

class [[eosio::contract("addressbook")]] addressbook : public eosio::contract {

public:

  addressbook(name receiver, name code,  datastream<const char*> ds): contract(receiver, code, ds) {}

  [[eosio::action]]

  void upsert(name user, std::string first_name, std::string last_name, uint64_t age, std::string street, std::string city, std::string state) {

    require_auth( user );

    address_index addresses( get_self(), get_first_receiver().value );

    auto iterator = addresses.find(user.value);

    if( iterator == addresses.end() )

    {

      addresses.emplace(user, [&]( auto& row ) {

      row.key = user;

      row.first_name = first_name;

      row.last_name = last_name;

      row.age = age;

      row.street = street;

      row.city = city;

      row.state = state;

      });

    }

    else {

      addresses.modify(iterator, user, [&]( auto& row ) {

        row.key = user;

        row.first_name = first_name;

        row.last_name = last_name;

        row.age = age;

        row.street = street;

        row.city = city;

        row.state = state;

      });

    }

  }

  [[eosio::action]]

  void erase(name user) {

    require_auth(user);

    address_index addresses( get_self(), get_first_receiver().value);

    auto iterator = addresses.find(user.value);

    check(iterator != addresses.end(), "Record does not exist");

    addresses.erase(iterator);

  }

private:

  struct [[eosio::table]] person {

    name key;

    std::string first_name;

    std::string last_name;

    uint64_t age;

    std::string street;

    std::string city;

    std::string state;

    uint64_t primary_key() const { return key.value; }

    uint64_t get_age() const { return age; }

  };

  // typedef eosio::multi_index<"people"_n, person> address_index;

  typedef eosio::multi_index<"people"_n, person,

    indexed_by<"byage"_n, const_mem_fun<person, uint64_t,

      &person::get_age>>> address_index;

};   

相关文章

  • [eos8]智能合约开发-非主索引(附属索引)

    https://developers.eos.io/welcome/latest/getting-started/...

  • 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索

    唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 组合索引 唯一索引/非唯一索引 唯一索引 1.唯一...

  • MySql优化

    MySqlInnoDB引擎支持事务 非主键索引都会存主键索引值非主键索引检索:先走非主键索引,再走主键索引 表即主...

  • 数据库索引专题

    1、索引的分类 深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集...

  • 索引

    Mysql索引模型采用B+树 主键索引与非主键索引 从图中不难看出,根据叶子节点的内容,索引类型分为主键索引和非主...

  • MySQL随笔05_索引(下)

    一、覆盖索引 非主键索引查询,若结果所需要的字段只在主键索引上有,则需要回到主键搜索树,此过程称为 回表 。 非主...

  • 避免回表与覆盖索引

    为什么要避免回表 mysql维护着两种索引树:聚集索引、非聚集索引。我们建立的索引都属于非聚集索引。通过非聚集索引...

  • mysql索引专题考点总结

    聚集索引和非聚集索引的结构 [ 概念 ] 聚集索引, 非聚集索引, 回表 , 覆盖索引 索引用B+树存储, 假设索...

  • 聚集和非聚集索引

    转载: 聚集和非聚集索引 是什么?区别是? 聚集索引就是以主键创建的索引 非聚集索引就是以非主键创建的索引 区别:...

  • IOS开发问题索引(四)

    全系列文章索引: IOS开发问题索引(一) IOS开发问题索引(二) IOS开发问题索引(三) IOS开发问题索引...

网友评论

      本文标题:[eos8]智能合约开发-非主索引(附属索引)

      本文链接:https://www.haomeiwen.com/subject/aesfxhtx.html