在 Postgresql db 上使用 ALTER SEQUENCE 进行 Sqitch 迁移没有效果

Posted

技术标签:

【中文标题】在 Postgresql db 上使用 ALTER SEQUENCE 进行 Sqitch 迁移没有效果【英文标题】:Sqitch migration with ALTER SEQUENCE on Postgresql db has no effect 【发布时间】:2020-01-15 04:30:32 【问题描述】:

当我使用 Sqitch 迁移创建表时,我想用 1 以外的其他值初始化它的起始 SERIAL PRIMARY KEY。但是,由于某种原因,ALTER SEQUENCE 命令似乎没有任何效果。

我的部署迁移如下所示:

BEGIN;

  CREATE TABLE "user" (
    "id" SERIAL PRIMARY KEY,

    ... more columns ...
  );

  ALTER SEQUENCE "user_id_seq" RESTART WITH 12345;

COMMIT;

当上述迁移成功运行后,我插入user 表的第一行的id 列的值为1

但是,如果我手动执行 ALTER SEQUENCE "user_id_seq" RESTART WITH 12345; 语句(在迁移运行之后),我插入的下一行 id 列的值是 12345

我已尝试将ALTER SEQUENCE... 语句移到它自己的迁移中,但这似乎没有任何积极作用。

如何在 Sqitch 迁移中成功执行 ALTER SEQUENCE... 语句?

【问题讨论】:

【参考方案1】:

你试过了吗:

SELECT setval("user_id_seq", 12345, false);

https://www.postgresql.org/docs/current/functions-sequence.html

更新:

这个呢?刚刚测试它工作正常

BEGIN;

CREATE SEQUENCE user_id_seq START 12345;

CREATE TABLE "user" (
  "id" integer NOT NULL DEFAULT nextval('user_id_seq'),
  --- rest fields
);

ALTER SEQUENCE user_id_seq OWNED BY user.id;

COMMIT;

【讨论】:

我确实试过了,忘了说。也不起作用,尽管它在迁移运行时输出 SELECT 值。 实际上你的情况也适用于我,一个改变ALTER SEQUENCE test_user_id_seq RESTART WITH 12345;我已经删除了单引号。 是的,没错。当我直接在数据库上运行查询时,它也适用于我。但它不适用于 Sqitch 迁移。 @Luke 我假设您的部署文件中有错误,因为当我测试您的案例时,我的案例都跟随我达到预期结果,而 user.id12345。我的意思是用 sqitch 测试 好的。我想我找到了问题所在。迁移和ALTER TABLE...,正如我在我的问题中所说的那样工作正常。但是,当我运行我的固定装置(开发数据)和集成测试时,我会在桌子上执行TRUNCATE 以将其清除。我怀疑TRUNCATE 正在重置SEQUENCE,但无论如何我永远不会在产品中使用TRUNCATE。因此,这只是本地开发/测试现象。感谢您的帮助!

以上是关于在 Postgresql db 上使用 ALTER SEQUENCE 进行 Sqitch 迁移没有效果的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL ALTER TABLE 命令

如何在 Postgresql 中使用 ALTER 将 VARCHAR 类型更改为 DATETIME?

PostgreSQL ALTER TABLE 命令

PostgreSQL ALTER TABLE 命令

13.PostgreSQL Alter,Truncate Table

postgresql: alter system