heroku Postgresql error on inserting new row 'PG::NotNullViolation:错误:列“id”中的空值违反了not-null约束'

lyfkaqu1  于 2023-08-06  发布在  PostgreSQL
关注(0)|答案(3)|浏览(149)

我只是将我的美国服务器迁移到heroku上的欧盟地区,restore将旧的database backup迁移到新服务器。不幸的是,我得到以下error,而试图insert an new row的表之一

INSERT INTO "users" ("created_at", "id", ...) VALUES ($1, $2, ...) [["created_at", Thu, 13 Oct 2016 23:53:17 CEST +02:00], ["id", nil], ...]

ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "id" violates not-null constraint

DETAIL: Failing row contains (null, ...)

字符串
我的架构如下所示

create_table "users", :id => false, :force => true do |t|
   t.integer  "id",          :null => false  
   t.datetime "created_at",  :null => false
   ...
end


我该如何解决此问题?

gr8qqesn

gr8qqesn1#

我已经尝试了以下解决方案来解决这个问题,我写下那些需要它的人。

解决方案#1

删除本地数据库

rake db:drop

字符串
运行迁移

rake db:migrate


现在使用--data-only选项导入生产数据库

pg_restore --data-only --verbose --no-acl --no-owner -h localhost -U user_name -d database_name latest.dump

  • 它部分解决了我的问题,但表中的lose all my data,所以this is not an suitable one。*
    解决方案#2(工作正常)

在观察到错误后,我明白了一些事情,比如主键序列被打破,系统不应该尝试在ID字段中插入空值,以及我的model forgot the primary key。然后通过模型和它的working fine得到I set the primary key

class User < ActiveRecord::Base
  self.primary_key = 'id'
end

ijnw1ujt

ijnw1ujt2#

我也遇到了同样奇怪的问题,并通过你第一个解决方案的一个轻微变体解决了它:

rake db:drop

字符串
然后,

rake db:migrate:reset


最后

pg_restore --verbose --data-only --disable-triggers --no-acl --no-owner -h localhost -U user_name -d database_name latest.dump


这样,它保持了数据库结构,只恢复数据,但是,通过不检查外键约束,它可以加载表,并且不会以一堆空表结束。

0g0grzrc

0g0grzrc3#

针对上述问题进行变通。我也有同样的问题,这个很有效

class UserManager < ApplicationRecord
 self.primary_key = 'id'

 before_save :increment_id

 def increment_id
  self.id = UserManager.last.id + 1
 end
end

字符串

相关问题