我有一個小表,並且某個字段包含類型「字符變化」。我試圖將其更改爲「整數」,但它給出了無法投射的錯誤。將varchar字段的類型更改爲整數:「不能自動轉換爲鍵入整數」
是否有解決方法,或者我應該只是創建另一個表,並使用查詢將記錄帶入它。
該字段只包含整數值。
我有一個小表,並且某個字段包含類型「字符變化」。我試圖將其更改爲「整數」,但它給出了無法投射的錯誤。將varchar字段的類型更改爲整數:「不能自動轉換爲鍵入整數」
是否有解決方法,或者我應該只是創建另一個表,並使用查詢將記錄帶入它。
該字段只包含整數值。
有一個從text
或varchar
至integer
沒有隱含(自動)投(即你可以不通過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的遷移,但其根本原因是相同的,答案適用。
與文本數據如果不小心或不混合整數你應該先執行以下更新命令(如果不是上述變更表會失敗):
UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
如果你想去掉不需要的字符和空格,你最好用'regexp_replace(col_name,'[^ 0-9。'','','g')'' 。不過,如果你想保留'NaN'和'Inf'和'10E42'科學記數法,你需要更復雜一些的東西。 –
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)'
您是否嘗試過使用數據進行此練習,並且您的數據是否完好? – itsols
只要列中的內容是整數,是 – bibangamba
它不適用於我。我正在使用ruby 2.2.3和rails 4.2.3 –
如果您在開發環境中工作(或生產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;
我認爲它會幫助你。
試試這個,它肯定會有效。
當寫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)'
以上會模仿你從其他數據庫適配器知道是什麼。如果您有非數字數據,結果可能會出乎意料(但畢竟轉換爲整數)。
我得到了同樣的問題。 比我意識到我有一個默認的字符串值,我試圖改變列。 刪除默認值使得錯誤消失:)
你試過什麼特定的ALTER TABLE和什麼是特定的錯誤信息? –
@ muistooshort我嘗試使用phppgadmin中的alter。選擇列並嘗試輸入新的字段類型。錯誤是:'SQL錯誤: 錯誤:列「MID」不能被轉換爲類型整數' – itsols
首先是要備份表。然後你可以在同一個表中創建另一個整數類型的列(比如說field2)。選擇轉換爲字段1的整數值到字段2。然後重命名該列。 – Igor