2012-11-01 69 views
112

我有一個小表,並且某個字段包含類型「字符變化」。我試圖將其更改爲「整數」,但它給出了無法投射的錯誤。將varchar字段的類型更改爲整數:「不能自動轉換爲鍵入整數」

是否有解決方法,或者我應該只是創建另一個表,並使用查詢將記錄帶入它。

該字段只包含整數值。

+0

你試過什麼特定的ALTER TABLE和什麼是特定的錯誤信息? –

+0

@ muistooshort我嘗試使用phppgadmin中的alter。選擇列並嘗試輸入新的字段類型。錯誤是:'SQL錯誤: 錯誤:列「MID」不能被轉換爲類型整數' – itsols

+3

首先是要備份表。然後你可以在同一個表中創建另一個整數類型的列(比如說field2)。選擇轉換爲字段1的整數值到字段2。然後重命名該列。 – Igor

回答

173

有一個從textvarcharinteger沒有隱含(自動)投(即你可以不通過varchar的功能期待integer或分配varchar領域的integer一個),所以你必須指定使用ALTER TABLE ... ALTER COLUMN ... TYPE ... USING有明確的轉換:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer); 

請注意,您可能在文本字段中有空格;在這種情況下,使用:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer); 

在轉換之前剝離空白區域。

如果該命令在psql中運行,則此錯誤信息顯而易見,但可能PgAdmin-III沒有向您顯示完整錯誤。這裏,如果我在psql測試它的PostgreSQL 9.2會發生什麼:

=> CREATE TABLE test(x varchar); 
CREATE TABLE 
=> insert into test(x) values ('14'), (' 42 '); 
INSERT 0 2 
=> ALTER TABLE test ALTER COLUMN x TYPE integer; 
ERROR: column "x" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer); 
ALTER TABLE   

感謝@muistooshort用於添加USING鏈接。

另請參閱this related question;這是關於Rails的遷移,但其根本原因是相同的,答案適用。

+0

謝謝您花時間。但我似乎無法得到這個工作。我嘗試了你的ALTER行,它給了我一個錯誤「使用附近的語法錯誤」 – itsols

+0

我的聲明:ALTER TABLE「tblMenus」ALTER COLUMN「MID」USING(trim(「MID」):: integer); – itsols

+1

@itsols完全是我的錯誤;正如我看到您的評論一樣,我糾正了它。見修訂。這是正確的演示代碼,只是不是一開始的通用示例。 –

0

與文本數據如果不小心或不混合整數你應該先執行以下更新命令(如果不是上述變更表會失敗):

UPDATE the_table SET col_name = replace(col_name, 'some_string', ''); 
+2

如果你想去掉不需要的字符和空格,你最好用'regexp_replace(col_name,'[^ 0-9。'','','g')'' 。不過,如果你想保留'NaN'和'Inf​​'和'10E42'科學記數法,你需要更復雜一些的東西。 –

55

this爲我工作。

變化VARCHAR列到int

change_column :table_name, :column_name, :integer 

有:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

chnged到

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 
+0

您是否嘗試過使用數據進行此練習,並且您的數據是否完好? – itsols

+3

只要列中的內容是整數,是 – bibangamba

+0

它不適用於我。我正在使用ruby 2.2.3和rails 4.2.3 –

0

如果您在開發環境中工作(或生產ENV它的可能。備份你的數據),然後首先清除DB字段中的數據或將該值設置爲0.

UPDATE table_mame SET field_name = 0;

之後,運行下面的查詢併成功運行查詢後,轉到schemamigration,然後運行遷移腳本。

ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0)USING field_name :: numeric;

我認爲它會幫助你。

6

試試這個,它肯定會有效。

當寫Rails遷移到字符串列轉換爲整數你通常會說:

change_column :table_name, :column_name, :integer 

不過,PostgreSQL會抱怨:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

的「提示」主要是告訴你,您需要確認您希望發生這種情況,以及如何轉換數據。只是說,這在您的遷移:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

以上會模仿你從其他數據庫適配器知道是什麼。如果您有非數字數據,結果可能會出乎意料(但畢竟轉換爲整數)。

1

我得到了同樣的問題。 比我意識到我有一個默認的字符串值,我試圖改變列。 刪除默認值使得錯誤消失:)