Tại sao chạy ALTER TABLE trên một cột khiến nó đi từ KHÔNG NULL sang NULL?


8

Tôi đang cập nhật hàng loạt cơ sở dữ liệu SQL Server. Tôi đang thay đổi tất cả các numeric(38,0)cột của chúng tôi thành int (vâng, tập lệnh SQL Server được tạo từ tập lệnh Oracle) . Sử dụng SMO và C # (Tôi là một kỹ sư sw) , tôi đã quản lý để tạo các tập lệnh thực sự tốt như SQL Server Management studio . Tất cả đều hoạt động rất độc đáo ngoại trừ một vấn đề cụ thể:

đối với một số ít các bảng, khi tôi gọi ALTER TABLE [myTable] ALTER COLUMN [columnA] INTnó quyết định cũng thay đổi cột từ NOT NULL to NULL. Tất nhiên đó là một vấn đề lớn vì tôi cần tạo lại các khóa chính cho hầu hết các bảng trên các cột cụ thể đó.

Rõ ràng, tôi có nhiều tùy chọn sử dụng SMO để tìm ra cột nào là khóa chính và buộc chúng KHÔNG phải là NULL sau hoặc trong khi tôi đang cập nhật loại dữ liệu, nhưng tôi thực sự tò mò về những gì có thể gây ra điều này.


Bạn có thể tìm ra điều này nếu các cột là thành viên của khóa chính thông qua T / SQL. SMO không bắt buộc.
mrdenny

Câu trả lời:


10

Nó phụ thuộc vào cài đặt của bạn về SET ANSI_NULL_DFLT_OFF hoặc SET ANSI_NULL_DFLT_ON (đọc các hiệu ứng này cho các hiệu ứng khác từ SET ANSI_DEFAULTS).

Cá nhân, tôi đã chỉ định rõ ràng ràng buộc này nếu tôi muốn các cột null hoặc không null thay vì dựa vào các cài đặt môi trường.

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL

Bạn có thể ban hành lệnh này một lần nữa và nếu một cột đã ở mức vô hiệu mong muốn, lệnh sẽ bị bỏ qua.

Tuy nhiên, bạn cũng nói rằng bạn chỉ cần thay đổi nó trong đó là một phần của khóa chính. Điều đó không có liên quan đến việc một cột có thể là null hay không từ giai đoạn mô hình hóa / thực hiện


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.