2014-09-19 191 views
0

我正在將Ruby on Rails應用程序從MySQL遷移到Postgres。是否有推薦的方法來保留已刪除的數據,就像MySQL中所有已刪除的記錄(至少是它們的ID)?MySQL到Postgres數據遷移

在測試轉儲和恢復似乎並沒有保留刪除的記錄。

此外,如果我設法保留記錄,Postgres中的空白將會發生什麼?他們會被跳過或使用?

說我有與101的ID的user和我已經刪除users高達100。我需要101留在101

+1

如果數據被刪除,它不再存在於數據庫中,所以你不能保留它。這沒有意義。你在說'AUTO_INCREMENT'鍵和PostgreSQL'SERIAL'列嗎? – 2014-09-19 01:17:16

+0

我會用一個例子更新這個問題。 – 2014-09-19 01:18:35

回答

2

因此,您不想重新分配分配給您生成密鑰的記錄的ID。

這應該是任何理智的遷移中的默認值。當您複製數據行時 - 比如說,從SELECT ... INTO OUTFILE從MySQL導出並導入到帶有COPY tablename FROM 'filename.csv' WITH (FORMAT CSV)的PostgreSQL中,ID不會更改。

您需要做的就是設置PostgreSQL表中序列中要生成的下一個ID。所以,說你有表:

CREATE TABLE users 
(
    id serial primary key, 
    name text not null, 
    ... 
); 

和你剛纔複製用戶與id = 101進去。

你現在只是分配一個新值密鑰生成序列爲表,如:

SELECT setval('users_id_seq', (SELECT max(id) FROM users)+1); 

要了解更多關於PostgreSQL中序列和密鑰生成,看到SERIAL in the numeric types documentation,對於文檔CREATE SEQUENCEsetval的文檔等。密鑰生成序列的默認名稱是tablename_columnname_seq

+0

噢好!當我認爲這可能是一個問題時,我開始恐慌。我是否必須爲每個表的密鑰生成順序分配新值? – 2014-09-19 01:26:28

+0

@emm是的。我會親自編寫腳本。以上假設您將數據表格逐個遷移爲CSV。如果您使用某種Rails級別的數據遷移,那麼所有內容都可能會有所不同。 – 2014-09-19 01:27:58

+0

真棒幫助。非常感謝。 – 2014-09-19 01:32:38