【问题标题】:How to reset autoIncrement primary key with sequelize?如何使用 sequelize 重置 autoIncrement 主键?
【发布时间】:2019-09-21 19:30:06
【问题描述】:

我使用 sqlite3 作为我的数据库并使用sequelize 库来处理它。 我有一个模块,想在截断后重置 autoIncrement 主键。

    var logModule = db.logModule()
    logModule.destroy({

        where:{},
        truncate: true
    })

但我发现这种方式只是清除表中的所有记录,并没有将autoIncrement 主键重置为零。

清除表中的所有记录后,有什么方法可以重置主键?

【问题讨论】:

  • sqlite 中自动增量的全部意义在于 rowid 永远不会被重用。在定义 INTEGER PRIMARY KEY 列时忽略自动增量,或者直接使用它。无论如何,rowid 是什么都不重要。如果你让 sqlite 选择 rowid,你永远不会接近最大值......

标签: node.js sqlite sequelize.js


【解决方案1】:

您应该通过restartIdentity: true 来销毁/截断sequelize 中的方法。

   models[modelName]
     .destroy({ truncate: true, restartIdentity: true })

restartIdentity - 仅与 TRUNCATE 一起使用。自动重新启动截断表的列所拥有的序列。

这与 sequelize 为 sqlite 生成的 id 字段无法正常工作。

你必须explicitly invoke the SQL:

DELETE FROM `sqlite_sequence` WHERE `name` = 'table_name'

【讨论】:

【解决方案2】:

SQLite 使用特殊的SQLITE_SEQUENCE 表来跟踪一个表曾经拥有的最大ROWID。每当创建包含AUTOINCREMENT 列的普通表时,就会自动创建和初始化SQLITE_SEQUENCE 表。

销毁表后,您必须执行查询重置表的SQE

sequelize.query("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='log_module_table_name'");

【讨论】:

    【解决方案3】:

    使用这个;

    Object.values(sequelize.models).map(function(model) {
      return model.destroy({ truncate: true });
    }); 
    

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 2010-10-31
      • 2017-02-07
      • 2014-03-05
      • 1970-01-01
      • 2012-12-29
      • 2020-06-05
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多