Cách thay đổi kiểu dữ liệu cột trong cơ sở dữ liệu SQL mà không mất dữ liệu


198

Tôi có cơ sở dữ liệu SQL Server và tôi nhận ra rằng tôi có thể thay đổi loại của một trong các cột từ intsang bool.

Làm thế nào tôi có thể làm điều đó mà không làm mất dữ liệu đã được nhập vào bảng đó?


3
Bạn đã thử tạo một cột bit mới, sao chép các giá trị từ cột cũ sang cột mới, xóa cột cũ và đổi tên cột mới chưa? Tất cả điều này trong một giao dịch, tất nhiên, để phục hồi các vấn đề.
Radu Caprescu

2
Bạn nói "Tôi vừa nhận ra rằng tôi có thể thay đổi kiểu từ một trong các cột từ int sang bool" Không có kiểu dữ liệu boolean. Có một chút mặc dù. Bạn có hỏi làm thế nào bạn có thể làm điều này (như 2 câu trả lời cho đến nay đã được đề cập). Hoặc là câu hỏi của bạn "Tôi vừa nhận ra điều này là có thể - SQL Server làm điều này như thế nào?"
Martin Smith

Câu trả lời:


329

Bạn có thể dễ dàng làm điều này bằng cách sử dụng lệnh sau đây. Mọi giá trị 0 sẽ được chuyển thành 0 (BIT = false), mọi thứ khác sẽ được chuyển thành 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Tùy chọn khác sẽ là tạo một cột kiểu mới BIT, điền nó vào cột cũ và sau khi bạn hoàn thành, thả cột cũ và đổi tên cột mới thành tên cũ. Theo cách đó, nếu có gì đó trong quá trình chuyển đổi bị lỗi, bạn luôn có thể quay lại vì bạn vẫn có tất cả dữ liệu ..


10
Nói cách khác: NULLvẫn còn NULL, 0trở thành False, các giá trị khác không (1, -1, 1999, -987 ...) trở thành True.
Álvaro González

2
Và không bao giờ thực hiện thay đổi như thế này từ GUI. Luôn luôn làm cho nó thông qua một kịch bản như thế này. GUI sẽ thả và tạo lại bảng và điều đó tốn nhiều thời gian hơn. Nếu bàn lớn và đang sản xuất, điều này có thể là thảm họa. Cộng với tất cả các thay đổi bảng nên có một tập lệnh nằm trong kiểm soát nguồn như tất cả các mã khác.
HLGEM

1
Tôi sẽ thêm, đảm bảo rằng bạn có một bản sao lưu cơ sở dữ liệu hiện tại trước khi thực hiện bất kỳ thay đổi cấu trúc nào đối với một bảng có dữ liệu. Và không chạy thay đổi như thế này khi sản xuất trong giờ sử dụng cao điểm nếu bảng thường xuyên được sử dụng hoặc lớn.
HLGEM

Tôi đã phê duyệt sai các chỉnh sửa ... cần phải từ chối .. bởi vì không cải thiện ở đó ... Ans là hoàn hảo.
Vikash Pathak

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Lưu ý: nếu có kích thước cột, chỉ cần viết kích thước cũng được.


20

Nếu đó là một thay đổi hợp lệ.

bạn có thể thay đổi tài sản.

Công cụ -> Tùy chọn -> Nhà thiết kế -> Nhà thiết kế bảng và cơ sở dữ liệu -> Bỏ chọn -> Ngăn chặn thay đổi yêu cầu tạo lại bảng.

Bây giờ bạn có thể dễ dàng thay đổi tên cột mà không cần tạo lại bảng hoặc mất các bản ghi ur.


5
Trong mọi trường hợp, bạn không nên thực hiện thay đổi bảng bằng GUI. Nó sẽ tạo lại hoàn toàn bảng thay vì sử dụng bảng Alter và điều này sẽ gây ra vấn đề nếu bạn bỏ chọn cái này và bảng lớn. Hơn nữa, bạn nên có tất cả các thay đổi đối với các bảng trong một tập lệnh trong kiểm soát nguồn.
HLGEM

Nhìn kỹ hơn vào tùy chọn đó - việc tắt an toàn sẽ ngăn GUI rơi khỏi bảng. Bạn sẽ không xuất hiện để dữ liệu bị mất, bởi vì GUI sẽ tái tạo bảng, nhưng trên máy chủ đó sẽ được sao chép / thả. Vì vậy, nếu có nhiều dữ liệu trong bảng, nó sẽ gây ra một hoạt động rất lớn. Ngoài ra, tôi nghĩ (không tích cực) rằng nó xảy ra trong một giao dịch, do đó bạn có thể điền vào nhật ký giao dịch của mình.
JMarsch

1
Tôi đoán tôi muốn thêm một chút làm rõ vào bình luận trước đây của tôi. Nếu bạn chỉ làm điều này trên máy phát triển của mình, có lẽ bạn vẫn ổn. Nhưng tôi không khuyên bạn nên sử dụng phương pháp này trên cơ sở dữ liệu sản xuất - đặc biệt nếu đó là một nhiệm vụ quan trọng.
JMarsch

8

Tại sao bạn nghĩ rằng bạn sẽ mất dữ liệu? Chỉ cần vào Management Studio và thay đổi kiểu dữ liệu. Nếu giá trị hiện tại có thể được chuyển đổi thành bool (bit), nó sẽ làm điều đó. Nói cách khác, nếu ánh xạ "1" thành ánh xạ đúng và "0" thành sai trong trường ban đầu của bạn, bạn sẽ ổn.


1
Nếu bạn có dữ liệu trong bảng thì điều này sẽ không hoạt động. Khi bạn cố gắng thay đổi loại cột, SMS tuyên bố rằng nó cần bỏ bảng trước tiên ... điều này tất nhiên là không chính xác vì lệnh ALTER TABLE ... ALTER COLUMN chỉ hoạt động tốt ngay cả đối với các trường không NULL. Đây là lý do tại sao họ nghĩ rằng họ có thể mất dữ liệu.
Tony O'Hagan

1
@ TonyO'Hagan Điều đó không đúng. Bạn có thể tắt cảnh báo và nó sẽ hoạt động tốt với dữ liệu hiện có. Xem thêm stackoverflow.com/questions/2947865/ khăn
Philippe Leybaert

1
Được rồi Không biết điều đó. Chỉ cố gắng bỏ phiếu cho bạn (trở lại) nhưng SO đang ngăn cản tôi trừ khi bạn chỉnh sửa câu trả lời của mình. Có lẽ một thay đổi nhỏ và tôi có thể làm như vậy;).
Tony O'Hagan

1
Trong mọi trường hợp, bạn không nên thực hiện thay đổi bảng bằng GUI. Nó sẽ tạo lại hoàn toàn bảng thay vì sử dụng bảng Alter và điều này sẽ gây ra vấn đề nếu bạn bỏ chọn cái này và bảng lớn. Hơn nữa, bạn nên có tất cả các thay đổi đối với các bảng trong một tập lệnh trong kiểm soát nguồn.
HLGEM

Trong mọi trường hợp, không có lý do nào để sử dụng GUI để thiết kế bảng hoặc thay đổi chúng và lý do chính đáng để không làm điều đó. Tất cả các thay đổi cần phải có trong các tập lệnh để có thể truyền tới các máy chủ khác và được xử lý như mã mà chúng thực sự nằm trong kiểm soát nguồn.
HLGEM

5

nếu bạn sử dụng T-SQL (MSSQL); bạn nên thử kịch bản này:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

nếu bạn sử dụng MySQL; bạn nên thử kịch bản này:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

nếu bạn sử dụng Oracle; bạn nên thử kịch bản này:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

Chuyển đến Trình thiết kế công cụ-tùy chọn-nhà thiết kế-bảng và cơ sở dữ liệu và bỏ chọn Tùy chọn lưunhập mô tả hình ảnh ở đây


1
Trong mọi trường hợp, bạn không nên thực hiện thay đổi bảng bằng GUI. Nó sẽ tạo lại hoàn toàn bảng thay vì sử dụng bảng Alter và điều này sẽ gây ra vấn đề nếu bạn bỏ chọn cái này và bảng lớn. Hơn nữa, bạn nên có tất cả các thay đổi đối với các bảng trong một tập lệnh trong kiểm soát nguồn.
HLGEM

2

Thay đổi kiểu dữ liệu cột với loại kiểm tra của cột:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

Đối với tôi, trong máy chủ sql 2016, tôi làm như thế này

* Để đổi tên cột Cột1 thành cột2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Để sửa đổi Loại cột từ chuỗi thành int :( Hãy chắc chắn rằng dữ liệu ở định dạng chính xác )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

Trong phiên bản rút gọn sẽ tự động lấy kích thước cho kiểu dữ liệu datetime tức là (8), do đó không cần đặt kích thước của trường và tạo lỗi cho thao tác này ...


-2

Tôi có thể sửa đổi kiểu dữ liệu của trường bảng, với các truy vấn sau: và cả trong Oracle DB,

ALTER TABLE table_name
MODIFY column_name datatype;

Không có trong Máy chủ SQl
HLGEM

-4

Thay thế kiểu dữ liệu mà không mất dữ liệu

alter table tablename modify columnn  newdatatype(size);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.