2017-03-15 54 views
1

在我的數據庫中,我有幾個INTEGER類型的字段。我需要將其中的一些改爲BIGINT。將列從INTEGER改爲BIGINT

所以我的問題是,我可以使用下面的命令嗎?

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT; 

包含的數據是否被正確轉換?在這個列轉換後是一個「真正的」BIGINT列?

我知道這是不可能的,如果這個列上有限制(觸發器,ForeingKey,...)。但是如果沒有限制,可以這樣做嗎?

還是更給它一個幫助列轉換:

MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn 
+0

如果其中一個或多個列都對他們沒有約束(如外鍵,索引,缺省值,規則等),然後ansвer是肯定的,該數據將被corectly轉換。(這對火鳥2.5對於火鳥3.0我不知道)。 –

+0

謝謝。因爲我不想在未來遇到我還不知道的問題。 – Andreas

+0

根據https://firebirdsql.org/refdocs/langrefupd25-ddl-table.html#langrefupd25-alter-table觸發器和存儲過程不會阻止更改列,因爲火鳥2.5型。 –

回答

6

當你執行

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT; 

火鳥不會將現有的INTEGERBIGINT數據,相反,它會創建一個表格的新格式版本。

當插入新行或更新現有行,該值將被存儲爲BIGINT,但閱讀火鳥將轉換上飛「老」行從INTEGERBIGINT時。這對於你作爲用戶來說是透明的。這是爲了防止需要重寫所有現有的行,這可能是昂貴的(IO,舊版本的行的垃圾收集等)。

所以請使用ALTER TABLE .. ALTER COLUMN,不要做MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn。此規則有一些例外情況,例如,如果在新字符集中不存在字符或將(var)char列更短(可能)有損字符集轉換更好地防止select上的音譯錯誤(這不能用alter column完成)。

更具體一點:在數據庫中寫入一行時,它包含該行的格式版本(又稱版本計數)。格式版本指向一行(數據類型等)的描述,Firebird應該如何讀取該行。 alter table將創建一個新的格式版本,並且在編寫新行或更新現有行時應用該格式。在閱讀舊行時,Firebird將應用必要的轉換將該行顯示爲新格式(例如,使用默認值添加新列,轉換列的數據類型)。

這些格式版本也是alter table數量受到限制的原因:如果您在單個表上應用了超過255個alter table,那麼must backup and restore the database(格式版本是單個字節),然後才能進一步更改表。

+0

謝謝你。因此,我將使用 「ALTER TABLE MyTable的ALTER COLUMN MyIntegerColumn bigint類型;」。我不知道的255 ALTER語句極限!很好知道!謝謝。 有沒有辦法讀取表的當前「版本計數」? – Andreas

相關問題