2012-05-18 44 views
10

Tôi có một cột mà tôi tin rằng đã được khai báo sai. Nó chứa dữ liệu và tôi không muốn mất dữ liệu.Sửa đổi loại cột có dữ liệu, mà không xóa dữ liệu

Tôi muốn thay đổi định nghĩa từ varchar (max) thành varchar (số nguyên). Tôi đã được ấn tượng tôi không thể chỉ thay đổi loại cột?

Phương pháp tốt nhất để tạo cột tạm thời, "cột2", chuyển dữ liệu sang cột này, từ cột có loại có vấn đề, xóa cột sự cố rồi đổi tên cột tạm thời thành cột có vấn đề ban đầu?

Nếu có, làm cách nào để sao chép các giá trị từ cột sự cố sang cột mới?

CHỈNH SỬA: Đối với bất kỳ ai có cùng vấn đề, bạn có thể chỉ cần sử dụng câu lệnh ALTER.

Trả lời

16

Miễn là các loại dữ liệu có phần "liên quan" - có, bạn hoàn toàn có thể làm điều này.

Bạn có thể thay đổi INT thành BIGINT - phạm vi giá trị của loại thứ hai lớn hơn, vì vậy bạn không có nguy cơ "mất" bất kỳ dữ liệu nào.

Bạn có thể thay đổi VARCHAR(50) thành VARCHAR(200) - một lần nữa, các loại tương thích, kích thước đang ngày càng lớn hơn - không có rủi ro cắt xén bất kỳ thứ gì.

Về cơ bản, bạn chỉ cần

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 

hoặc bất cứ điều gì. Miễn là bạn không có chuỗi dài hơn 200 ký tự đó, bạn sẽ ổn thôi. Bạn không chắc chắn điều gì sẽ xảy ra nếu bạn đã có chuỗi dài hơn - hoặc chuyển đổi sẽ không thành công với lỗi hoặc nó sẽ tiếp tục và cho bạn biết rằng một số dữ liệu có thể đã bị cắt bớt. Vì vậy, tôi đề nghị đầu tiên bạn cố gắng này trên một bản sao dữ liệu của bạn :-)

Nó được một chút phức tạp hơn nếu bạn cần thay đổi một VARCHAR một INT hoặc một cái gì đó như thế - rõ ràng là, nếu bạn có giá trị cột đó không "phù hợp" vào loại mới, chuyển đổi sẽ không thành công. Nhưng ngay cả khi sử dụng một cột "tạm thời" riêng biệt sẽ không sửa lỗi này - bạn cần phải đối phó với những trường hợp "không tương thích" bằng cách nào đó (bỏ qua chúng, để NULL trong đó, đặt chúng thành giá trị mặc định - một cái gì đó).

Ngoài ra, việc chuyển đổi giữa VARCHARNVARCHAR có thể trở nên phức tạp nếu bạn có, ví dụ: các ký tự không phải của Tây Âu - bạn có thể mất các mục nhập nhất định khi chuyển đổi, vì chúng không thể được thể hiện ở định dạng khác hoặc chuyển đổi "mặc định" từ loại này sang loại khác không hoạt động như mong đợi.

+1

Làm việc cho 'CHAR' đến' VARCHAR' và thậm chí cắt tỉa phần đệm. –

+0

Tôi gặp sự cố khi thay đổi từ VARCHAR sang TEXT, bất kỳ ý tưởng nào? – Murilo

+1

@Murilo: vì 'TEXT' đã bị hủy ** và sẽ bị xóa sớm, tôi sẽ KHÔNG ** sửa đổi cột * thành * kiểu dữ liệu' TEXT' - sử dụng 'VARCHAR (MAX)' thay vào đó, nếu bạn thực sự cần nhiều hơn 8000 ký tự của dữ liệu –

0

thêm cột tạm thời2 với loại varchar (NN), chạy update tbl set column2 = column, kiểm tra xem có lỗi nào xảy ra hay không; nếu mọi thứ đều ổn, hãy thay đổi cột ban đầu của bạn, sao chép dữ liệu và xóa cột 2.

1

Tính lưu trữ độ dài dữ liệu tối đa trong cột đó của bảng đó.

Select max(len(fieldname)) from tablename 

Bây giờ bạn có thể giảm kích thước của cột đó xuống kết quả trong truy vấn trước đó.

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 
+0

Đây có phải là bước đầu tiên cần thiết nếu bạn nhìn vào SCHEMA của bảng ở nơi đầu tiên? –

+0

bạn muốn giảm trường varchar, vì vậy đây phải là bước đầu tiên. –

+1

Tôi xin lỗi. Tôi hiểu sai và nghĩ rằng anh ta đang mở rộng, không co lại. –

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