sequelize autoIncrement为postgres开始id

时间:2016-05-24 19:45:50

标签: postgresql sequelize.js

我想在我的模型上使用autoIncrement id键,但我还需要在它们之间创建灯具和关系。当我创建灯具时,我会手动指定ID(因此我不必太依赖于可能会出错的订单和假设)。但是当我去创建更多实例(没有指定id,让autoIncrement接管)时,我会遇到来自灯具的ID的碰撞。

我希望能够将初始自动增量编号设置为1000,以便我可以使用手动选择的ID创建大量灯具而不会遇到麻烦......或者是否有其他方法可以解决此问题可能?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。解决这个问题的一种方法是在你的灯具中保留'id'(自动增量),并假设你已经清除了数据库中的数据,将外键(在你的灯具中)链接到它们应该的内容自动增量后。

这样做,因为你在夹具数据中留下id,Postgres将更新它用来为表X分配自动增量值的序列(来自X_id_seq - 你可以psql; \ c; \ d(到list dbs);从X_id_seq中选择*。

另一种方法是继续做你(和我)正在做的事情,即手动设置自动增量id,然后以某种方式改变序列表X_id_seq,将其last_value设置为它应该的值。

您可能必须通过sequelize运行手动sql查询。

另一个选择是通过自己的模型做自己的灯具。我正在做的事情,现在正在认真考虑恢复......

编辑:另外,如果你正在使用sequelize-fixtures,你可能想看一下这里的最后一条评论:https://github.com/domasx2/sequelize-fixtures/issues/43#issuecomment-147955330

修改:已打开的问题:https://github.com/domasx2/sequelize-fixtures/issues/71

编辑:作为一个临时解决方案,在没有sequelize-fixture之前重写所有内容,我使用以下方法手动设置序列:

await db.sequelize.query(
    `ALTER SEQUENCE "ItemInstances_id_seq" RESTART WITH ${itemInstances.length + 1};`
);

当你这样做时(在加载灯具之前/之后),我觉得这并不重要,因为你无论如何要绕过序列。