我正在將Ruby on Rails應用程序從MySQL遷移到Postgres。是否有推薦的方法來保留已刪除的數據,就像MySQL中所有已刪除的記錄(至少是它們的ID)?MySQL到Postgres數據遷移
在測試轉儲和恢復似乎並沒有保留刪除的記錄。
此外,如果我設法保留記錄,Postgres中的空白將會發生什麼?他們會被跳過或使用?
例
說我有與101
的ID的user
和我已經刪除users
高達100
。我需要101
留在101
。
我正在將Ruby on Rails應用程序從MySQL遷移到Postgres。是否有推薦的方法來保留已刪除的數據,就像MySQL中所有已刪除的記錄(至少是它們的ID)?MySQL到Postgres數據遷移
在測試轉儲和恢復似乎並沒有保留刪除的記錄。
此外,如果我設法保留記錄,Postgres中的空白將會發生什麼?他們會被跳過或使用?
例
說我有與101
的ID的user
和我已經刪除users
高達100
。我需要101
留在101
。
因此,您不想重新分配分配給您生成密鑰的記錄的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 SEQUENCE
,setval
的文檔等。密鑰生成序列的默認名稱是tablename_columnname_seq
。
噢好!當我認爲這可能是一個問題時,我開始恐慌。我是否必須爲每個表的密鑰生成順序分配新值? – 2014-09-19 01:26:28
@emm是的。我會親自編寫腳本。以上假設您將數據表格逐個遷移爲CSV。如果您使用某種Rails級別的數據遷移,那麼所有內容都可能會有所不同。 – 2014-09-19 01:27:58
真棒幫助。非常感謝。 – 2014-09-19 01:32:38
如果數據被刪除,它不再存在於數據庫中,所以你不能保留它。這沒有意義。你在說'AUTO_INCREMENT'鍵和PostgreSQL'SERIAL'列嗎? – 2014-09-19 01:17:16
我會用一個例子更新這個問題。 – 2014-09-19 01:18:35