Không có truyền ngầm (tự động) nào từ text
hoặc varchar
thành integer
(tức là bạn không thể vượt qua varchar
đến một hàm mong đợi integer
hoặc gán một varchar
trường thành một số nguyên integer
một), vì vậy bạn phải chỉ định một diễn viên rõ ràng bằng cách sử dụng ALTER TABLE ... ALTER COLUMN ... TYPE ... SỬ DỤNG:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Lưu ý rằng bạn có thể có khoảng trắng trong các trường văn bản của mình; trong trường hợp đó, hãy sử dụng:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
để loại bỏ khoảng trắng trước khi chuyển đổi.
Điều này rõ ràng là từ một thông báo lỗi nếu lệnh được chạy trong psql
, nhưng có thể PgAdmin-III không hiển thị cho bạn toàn bộ lỗi. Đây là những gì sẽ xảy ra nếu tôi kiểm tra nó trong psql
trên 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
Cảm ơn @muistooshort đã thêm USING
liên kết.
Xem thêm câu hỏi liên quan này; đó là về việc di chuyển Rails, nhưng nguyên nhân cơ bản là giống nhau và câu trả lời sẽ áp dụng.
Nếu lỗi vẫn xảy ra, thì nó có thể không liên quan đến các giá trị cột, nhưng các chỉ mục trên cột này hoặc các giá trị mặc định của cột có thể không đánh máy được. Chỉ mục cần được loại bỏ trước ALTER COLUMN và tạo lại sau đó. Giá trị mặc định phải được thay đổi một cách thích hợp.