在 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.id
是 12345
。我的意思是用 sqitch 测试
好的。我想我找到了问题所在。迁移和ALTER TABLE...
,正如我在我的问题中所说的那样工作正常。但是,当我运行我的固定装置(开发数据)和集成测试时,我会在桌子上执行TRUNCATE
以将其清除。我怀疑TRUNCATE
正在重置SEQUENCE
,但无论如何我永远不会在产品中使用TRUNCATE
。因此,这只是本地开发/测试现象。感谢您的帮助!以上是关于在 Postgresql db 上使用 ALTER SEQUENCE 进行 Sqitch 迁移没有效果的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Postgresql 中使用 ALTER 将 VARCHAR 类型更改为 DATETIME?