I recently migrated my rails app to PostgreSQL in order to take advantage of fulltext search.
Since the migration coincided with moving to a new webhost, the steps for migration were:
Deploy the application and db:create/db:schema:load on the new server, with appropriate database.yml file
mysqldump data only from existing MySQL production database
import data into PostgreSQL database
The application is running successfully but the issue comes when trying to add new content to the database. For example, when I run the rake task to update my twitter feed:
PG::Error: ERROR: duplicate key value violates unique constraint "twitter_feeds_pkey" DETAIL: Key (id)=(3) already exists.
This also happens for all other models, creating new articles, users etc. In development I can see that posting the insert statement n+1 times will successfully save the record without error.
My question is: How do I tell PostgreSQL to start adding indexes sequentially from the existing data?
I've read the REINDEX page but don't think that is really the operation I'm looking for.
解决方案
If the schema contains serial or sequence columns, you should reset these to the max value that occurs in the corresponding column. (normally you should not import the serials from a file, but give them the freedom to autoincrement.)
For all imported tables you should identify the sequence fields and run the following code on them. (substitute your schema name for "sch", your table name for "mytable" and your id column name for "id")
WITH mx AS ( SELECT MAX(id) AS id FROM sch.mytable)
SELECT setval('sch.mytable_id_seq', mx.id) AS curseq
FROM mx
;