gpt4 book ai didi

ruby-on-rails - 使用 postgresql 在 rails 4 上恢复自动增量 id

转载 作者:行者123 更新时间:2023-11-29 11:59:53 25 4
gpt4 key购买 nike

我需要将一些数据从我们拥有的旧网站迁移到新的 Rails 网站。我需要保留我的城市 ID,所以我创建了我的表并将 id 设置为 false 并手动创建了该列:

create_table "cities", id: false, force: true do |t|
t.integer "id", null: false
t.string "name", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "is_active", default: true, null: false
t.string "code_che"
end

add_index "cities", ["id"], name: "index_cities_on_id", unique: true, using: :btree

完成迁移后,我希望能够创建新城市,例如 City.create(name: 'My big city') 但出现下一个错误:

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

很明显我弄错了,你能帮我看看在哪里吗?我将 Rails 4 与 postgresql gem 一起使用。

谢谢。

最佳答案

可能有一种更符合 Rails 风格的方法,但您需要直接使用 SQL 来执行此操作。将“12345”替换为比“id”的当前最大值大一。

CREATE SEQUENCE cities_id_seq START WITH 12345;
ALTER TABLE cities ALTER COLUMN id SET DEFAULT 'nextval(''cities_id_seq''::regclass)';
ALTER TABLE cities ALTER COLUMN id SET NOT NULL;

您可以像这样将其放入 Rails 迁移中:

def up
execute %Q{
CREATE SEQUENCE cities_id_seq START WITH 12345;
ALTER TABLE cities ALTER COLUMN id SET DEFAULT 'nextval(''cities_id_seq''::regclass)';
ALTER TABLE cities ALTER COLUMN id SET NOT NULL;
}
end

附言下次您可以将序列创建留给 rails,当您迁移数据时,只需直接设置 id 值。然后当你完成时,更新序列的下一个值是一件简单的事情。

关于ruby-on-rails - 使用 postgresql 在 rails 4 上恢复自动增量 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27804995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com