Rethinkdb中的自动增量

时间:2015-09-24 03:02:01

标签: rethinkdb

RethinkDb是否在类似于Mysql中的AUTO_INCREMENT的整数列上支持AUTO_INCREMENT。 https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

4 个答案:

答案 0 :(得分:4)

不,RethinkDB不支持它。原因是它的分布。在这样的环境中很难有一个自动增量号,因为你必须在多台机器上检查下一个增量值。

现在,让我们想一想自动增量解决的问题是什么?在MySQL上,我们希望将它用于主键,因此它需要是唯一的。这就是它的全部。自动增量不会给你任何其他东西。

在RethinkDB中,UUID保证唯一性,特别是在主键的情况下。

自动增量也是可以预测的,可能它不会导致任何有害但理想情况下,它可以让人们了解下一次攻击的价值。例如,采取一个糟糕的设计应用程序,我们可以访问一些URL,如/ this / is / a / sensitive / part / 123,有人可以点击/ this / is / a / sensitive / part / 124。当然,这是没有可靠的身份验证系统的应用程序的错误。但是,UUID可能有助于减少这一点,因为UUID是不可预测的。

答案 1 :(得分:1)

我们按照以下示例进行存档

```

r.db('autoInc').table('testauto')
.insert(r.do(function() {
    return {
        autoVal:r.branch(
            r.db('FlowzEngine').table('task_worker').isEmpty().not()
                .and(r.db('FlowzEngine').
                 table('task_worker').hasFields('autoVal')
                .isEmpty().not()),
            r.db('FlowzEngine').table('task_worker')
                .hasFields('autoVal').max('autoVal')
                .do(function(doc){
                    return doc('autoVal').add(1)
                }),
            1)}
}))

```

答案 2 :(得分:0)

您可以使用如下的计数器表来实现此目的:

 r.table('counters')
    .get(id)
    .update({ 
        count: r.row('count')
        .default(0)
        .add(1)
    }).run(conn, callback);

答案 3 :(得分:0)

如果使用Daniel Mewes php-rql,则基于Chirag答案的示例适用于php。

出于某种原因,Chirag的答案是使用单独的表显示的,这不是必需的,不确定示例中是否存在疏忽。

$result = \r\table('user')
            ->insert(array(
                'username' => $username, /* other data for example */
                'password' => $password,
                'userId' =>
                \r\rDo(null, function($arg) {
                    return \r\branch(
                        \r\table('user') /* if */
                            ->isEmpty()->not()
                            ->rAnd(
                                \r\table('user')
                                ->hasFields('userId')
                                ->isEmpty()->not()
                            ),
                        \r\table('user') /* then */
                            ->hasFields('userId')
                            ->max('userId')
                            ->rDo(function($arg) {
                                return $arg('userId')->add(1);
                            }),
                        1); /* else */
                })
            ))
            ->run($db);

我认为我会添加它,因为花了我几分钟多的时间才能在PHP上运行它,语法上的差异可能会令人讨厌。