我遇到了同样的问题post。但我正在使用Rails,并且不知道如何在activerecord中执行此解决方法。
我正在使用seeds.rb插入一些数据:
device_platforms = DevicePlatform.create([{id: 1, name: 'Android'}, {id: 2, name: 'IOS'}, {id: 3, name: 'Windows Phone'}])
当我插入另一个DevicePlatform时,我得到了这个例外:
Failure/Error: @device_platform = FactoryGirl.create(:device_platform)
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERRO: duplicar valor da chave viola a restrição de unicidade "device_platforms_pkey"
DETAIL: Chave (id)=(2) já existe.
: INSERT INTO "device_platforms" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) RETURNING "id"
该消息是葡萄牙语,它表示已存在具有该ID的行。
感谢。
答案 0 :(得分:2)
我相信,尽管这是一种坏习惯,但很多时候,这是唯一的手段
您可以定义此方法:
def fix_self_increment(model)
ActiveRecord::Base.connection.execute(
"BEGIN; " \
"LOCK TABLE #{model.table_name} IN EXCLUSIVE MODE; " \
"SELECT setval('#{model.table_name}_id_seq', COALESCE((SELECT MAX(id)+1 FROM #{model.table_name}), 1), false); " \
"COMMIT;"
)
end
然后致电
fix_self_increment(DevicePlatform)
享受
答案 1 :(得分:-3)
根据评论,在种子中使用id是一种不好的做法。我正在避免不良做法,这对我来说已经足够了。更改了我的代码以避免这种情况。