相关疑难解决方法(0)

如何在postgres不同步时重置postgres的主键序列?

我遇到了我的主键序列与我的表行不同步的问题.

也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.

这似乎是由导入/恢复不能正确维护序列引起的.

postgresql primary-key database-sequence

482
推荐指数
17
解决办法
23万
查看次数

Rails自动分配已存在的id

我创建了一个像这样的新记录:

truck = Truck.create(:name=>name, :user_id=>2)

我的数据库目前有几千个实体用于卡车,但我分配了其中几个的id,以某种方式留下了一些id.所以正在发生的是rails创建id为150的项目并且它工作正常.但后来它尝试创建一个项目并为其指定id = 151,但该ID可能已经存在,所以我看到了这个错误:

ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey" DETAIL: Key (id)=(151) already exists.

下次我运行动作时,它只会分配id 152,如果尚未获取该值,则可以正常工作.如何在分配ID之前检查ID是否已存在?

谢谢!

编辑

卡车ID是重复的东西.用户已经存在,在这种情况下是常量.它实际上是我必须处理的遗留问题.一种选择是在let rails重新创建表,这次自动分配每个id.我开始认为这可能是最好的选择,因为我还有其他一些问题,但是这样做的迁移会非常复杂,因为Truck是很多其他表中的外键.是否有一种简单的方法可以让rails创建一个新表,其中包含已存储在Truck下的相同数据,具有自动分配的ID并维护所有现有关系?

postgresql ruby-on-rails ruby-on-rails-3

89
推荐指数
4
解决办法
2万
查看次数

heroku上的Rails:推送后,获取"PG :: UniqueViolation:ERROR:重复键值违反唯一约束"

之前已经多次询问过(这里这里,以及更多).

每次我将我的rails应用程序推送到Heroku(至少过去几个月,我会说),我必须使用熟悉的重置我的键

ActiveRecord::Base.connection.tables.each { |t|    ActiveRecord::Base.connection.reset_pk_sequence!(t) }
Run Code Online (Sandbox Code Playgroud)

咒语.否则,当我尝试创建新记录时,我得到这样的postgresql失败:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "users_clients_pkey" DETAIL: Key (id)=(401) already exists. : INSERT INTO "users_clients" ("user_id", "client_id") VALUES (20, 46) RETURNING "id"
Run Code Online (Sandbox Code Playgroud)

(这是一个示例;它发生在各种表上,具体取决于推送后在应用程序上执行的第一个操作.)

一旦我执行了重置键咒语,它就可以了,直到我下次推送到heroku ...即使我的推送不包括任何迁移.

我有点困惑为什么会发生这种情况以及可以采取哪些措施来防止这种情况发生.

不,我的部署任务中没有可数据化的操作代码.

ruby postgresql ruby-on-rails heroku

5
推荐指数
1
解决办法
807
查看次数