2013-03-27 35 views
13

Chúng ta có một cột VARCHAR trong một bảng, mà chúng ta cần phải nâng cấp lên kiểu enum.Nâng cấp một cột VARCHAR thành loại enum trong postgresql

Tất cả các giá trị trong cột VARCHAR là các giá trị hợp lệ trong điều tra. Không có giá trị null trong cột varchar.

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 

ERROR: Cột "varcharColumn" không thể được đúc để gõ enum_type bang SQL: 42804

Vòng khoảng cách là

  1. Tạo một cột mới với kiểu enum.
  2. Cập nhật cột loại enum bằng cột varchar sau khi nhập.
  3. Thả cột VARCHAR.
  4. Đổi tên tên cột kiểu enum thành tên cột varchar.

Có cách nào tốt hơn để đạt được điều này không?

Xin cảm ơn trước.

Trả lời

24

Bạn cần xác định một dàn diễn viên được sử dụng vì không có sẵn tính năng truyền mặc định.

Nếu tất cả các giá trị trong varcharColumn tuân theo các định nghĩa enum, sau đây nên làm việc:

alter table foo 
    ALTER COLUMN varcharColumn TYPE enum_type using varcharColumn::enum_type; 

Cá nhân tôi không thích sự đếm, vì họ là khá unflexible. Tôi thích một ràng buộc kiểm tra trên một cột varchar nếu tôi muốn hạn chế các giá trị trong một cột. Hoặc - nếu danh sách các giá trị thay đổi thường xuyên và sẽ phát triển - một "bảng tra cứu" cũ tốt có ràng buộc khóa ngoài.

+0

Enums cũng có nhiều vấn đề hơn khi làm việc với một số ứng dụng khách hơn so với các bảng tra cứu hoặc các cột bị ràng buộc đơn giản. Như bất cứ ai đã có những niềm vui không rõ ràng của làm việc với enums trong JPA/Hibernate biết. –

+0

Cảm ơn a_horse_with_no_name! Mặc dù tôi đã tìm ra giải pháp từ tài liệu, giải thích của bạn khá toàn diện và hữu ích. – Gopal

+0

Gần đây tôi cần phải tổ chức lại enums bằng cách di chuyển chúng đến các lược đồ là nó có ý nghĩa hơn cho chúng. Như vậy, các bảng dựa vào các enums cần thiết để có các loại "thay đổi" để trỏ đến vị trí mới cho enum. Tôi đã làm nó như sau, với một diễn viên đôi: 'thay đổi bảng my_schema.my_column thay đổi cột sale_item_status loại my_schema.my_column_enum bằng cách sử dụng ((my_column :: văn bản) :: my_schema.my_column_enum)' - HTH bất cứ ai khác với enum " vấn đề "về bản chất này –

3

OK.

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 
    USING varcharColumn::enum_type 

sẽ cập nhật thành công.

Các vấn đề liên quan