如果用的是 postgresql 数据库,导完数据,我一般会跑这么一个 migration,让表的 id sequence 值变成最大,就不会有主键重复的问题了:
defchangeActiveRecord::Base.connection.execute("SELECT * FROM pg_catalog.pg_tables where schemaname='public'").eachdo|r|nextifr["tablename"]=='schema_migrations'sequence="#{r["tablename"]}_id_seq"count=ActiveRecord::Base.connection.execute("SELECT count(*) FROM pg_class where relname='#{sequence}'")nextifcount[0]['count'].to_i==0max=ActiveRecord::Base.connection.execute("SELECT MAX(id) FROM #{r["tablename"]}")start=max[0]['max'].to_icurrent=ActiveRecord::Base.connection.execute("SELECT nextval('#{sequence}')")curval=current[0]['nextval'].to_iifcurval<=startActiveRecord::Base.connection.execute("SELECT setval('#{sequence}', #{start+1}, true)")endendend