我需要將數據類型從float更改爲數據庫的十進制,目前有10億條記錄。有沒有不可預見的問題?謝謝我需要將數據類型從float更改爲數據庫的十進制,目前有10億條記錄
回答
這將需要很長時間,並採取了大量的精心策劃。如果你非常仔細地做,你應該計劃多天。如果你只是做一個ALTER TABLE,它可能會運行一個星期然後崩潰。我不是在開玩笑。
你能避免這樣做嗎?你能創建一個視圖來顯示float列作爲小數嗎?你會很聰明,試圖避免它。
如果您必須繼續這樣做,您應該嘗試在表中添加新列而不是更改現有列。假設您的舊列名爲metric
,新列名爲dmetric
。進一步假設你的metric
列被定義爲NOT NULL。
然後創建新列,以便它允許NULL。
然後把一個索引放在新列上。
然後運行此UPDATE查詢大約50萬次,直到它不處理任何行。
UPDATE table SET dmetric = metric
WHERE dmetric IS NULL
LIMIT 2000
這將做合理大小的塊轉換,並且過於龐大保持事務(如果你在InnoDB的世界是)。
請在表的副本上嘗試此操作。
感謝Ollie,如何擁抱浮動浮動(10,3),你知道任何休息會發生?謝謝Phuong –
'FLOAT(10,3)'和'DOUBLE'是一樣的。如果您將列轉換爲「DECIMAL(10,3)」,您將會遇到類似的問題,將列從「FLOAT」轉換爲該格式。 –
感謝Ollie,我們需要更改爲數據類型的原因是因爲它是浮點數,所以默認情況下它只有6位數,因此值曾經低於999.999。現在它的計數高達1000.01(因爲6位數字將精度截斷爲2位數字),我的僱主始終需要3位數的精度來保證數據的準確性...然後舊數據類型Float肯定會傾向於以適應未來的準確性問題。我們有56列Float需要更改爲Decimal,我不知道我該如何安全地做... –
另一種方法來解決這個問題,如果你的千兆行表有ID號或其他一些可行的主鍵,那麼這個方法就行得通。這將允許您在沒有太多停機時間的情況下升級精度。
創建新表 - 稱之爲precision_value
- 兩列:
id BIGINT NOT NULL pk
dmetric DOUBLE (or DECIMAL(10,3))
更改您的查詢需要更高的精度,這樣的事情。
SELECT a.id, ...,
COALESCE(b.dmetric, a.metric) dmetric,
...
FROM your_big_table a
LEFT JOIN `precision_value` b ON a.id = b.id
此使用的LEFT JOIN
和COALESCE
將尋找每個值先在自己的新表,然後在現有的表。如果存在更高精度的值,您將從新表中取回,否則您將獲得原始值。爲此創建一個視圖可能很方便。
然後,將您的新到達的高精度數據值,新的觀測等,爲您的新表,以及現有的一個
INSERT INTO your_big_table (metric, whatever) VALUES ('1.234567890', 'whatever');
INSERT INTO precision_values (id, dmetric) VALUES (LAST_INSERT_ID(), '1.234567890')
這個新表基本上是爲更高精度的數據後備表。
最後,將您的輸出合適地轉發到您的應用程序。例如,如果你想要三位小數,這將做到這一點。
SELECT a.id, ...,
ROUND(COALESCE(b.dmetric, a.metric),3) dmetric,
- 1. 更改數據庫數據類型爲十進制
- 2. 數據庫設計 - 一張表中有數十億條記錄?
- 3. 我想在oracle數據庫中插入10億條記錄
- 4. 將數據類型從int更改爲包含數十億行的表的數據類型
- 5. 數據庫含7億條記錄
- 6. 更改數據表的數據類型使用十進制
- 7. 最快的nosql爲數十億記錄
- 8. 上傳服務器上有數十億條記錄的文件,並在數據庫中插入記錄
- 9. 我的代碼在將數據類型從float更改爲double時生成-nan
- 10. python-mysqldb:如何從數據庫中有效獲取數百萬/數十億條記錄?
- 11. 將數據類型數字轉換爲十進制時出錯
- 12. 使用組聚合時,數據類型從Int更改爲Float
- 13. 帶有潛在數十億條記錄的ORM使用
- 14. 當數據從數據庫讀取時需要進度條
- 15. 將int轉換爲十進制數據類型的過程?
- 16. 我是否需要更改默認的數據庫前綴?
- 17. 獲得數據庫前10名記錄和從當前登錄用戶記錄
- 18. vb.net大於十進制數據類型
- 19. SQL Server十六進制數據類型
- 20. 在Java十六進制數據類型
- 21. C#,VB6和十進制數據類型
- 22. 我的產品目錄重量(十進制)不會更新爲十進制數
- 23. 轉換爲有效的十進制數據類型
- 24. 將數據類型十進制更改爲浮點數會導致數據丟失嗎?
- 25. 將二進制,十六進制和八進制轉換爲java數據類型
- 26. 熊貓groupby +轉換需要6億條記錄的小時數
- 27. 將SQL記錄從文件導入到sql數據庫並更改類型
- 28. 將文本文件中的數據類型從字符串更改爲float Python
- 29. 大型數據庫500萬條記錄
- 30. 爲什麼haskell中的「需要」更改數據類型?
啊是的,Rumsfeldian系統管理。已知的未知數,未知的未知數...... –
確保在執行此操作之前在另一個環境中測試此操作! – Randy
Innodb? MyISAM數據?現有的FLOAT列是否定義爲允許NULL?推動這種轉換要求的確切數字情況是什麼? –