Bảng sửa đổi: Cách thay đổi thuộc tính 'Cho phép Nulls' từ không null để cho phép null


207

Làm cách nào để thay đổi một thuộc tính trong bảng bằng T-SQL để cho phép null (không phải null -> null)? Thay đổi bảng có thể?


12
SQL Server Management Studio tạo một tập lệnh rất phức tạp cho một tác vụ đơn giản như vậy. Đó là lý do tại sao tôi đã nhầm lẫn và kiểm tra stackoverflow. Có lẽ đó là điểm của câu hỏi ...
Tillito

Câu trả lời:


363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL

4
Hoặc giống ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)như nó sẽ mặc định cho phép null nếu không được chỉ định rõ ràng khác.
Martin Smith

3
Lưu ý nếu cần thay đổi nhiều cột để cho phép null, thì bạn sẽ cần thực hiện ALTER TABLE .. ALTER COLUMN ..các lệnh riêng biệt
sonyisda1

2
Lưu ý rằng có một số trường hợp điều này có thể không hoạt động - hãy xem câu trả lời DBA Stack Exchange này nếu bạn nhận đượcALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon

49

Có, bạn có thể sử dụng ALTER TABLEnhư sau:

ALTER TABLE [table name] ALTER COLUMN [column name] [data type] NULL

Trích dẫn từ ALTER TABLEtài liệu:

NULLcó thể được chỉ định ALTER COLUMNđể buộc một NOT NULLcột cho phép các giá trị null, ngoại trừ các cột trong các ràng buộc PRIMARY KEY.


22

ALTER TABLE là đúng:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
Bạn có chắc chắn cần xác định lại các ràng buộc và chỉ loại dữ liệu không? Bài viết MSDN không đề cập đến các ràng buộc cần phải được xác định lại: "Nếu NULL hoặc KHÔNG NULL được chỉ định bằng ALTER COLUMN, new_data_type [(chính xác [, tỷ lệ])] cũng phải được chỉ định. Nếu loại dữ liệu, độ chính xác và quy mô không được thay đổi, chỉ định các giá trị cột hiện tại. "
Daniel Vassallo

@Daniel Vassallo - Bạn nói đúng. Tôi đã cố gắng để hoàn thành, nhưng thay đổi NULL / KHÔNG NULL nên là thay đổi duy nhất.
Oded

5

Đối với MySQL, MariaDB

ALTER TABLE [table name] MODIFY COLUMN [column name] [data type] NULL

Sử dụng MODIFY COLUMNthay vì ALTER COLUMN.


4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;

2
@ ÁronLőrincz câu hỏi không phải là về Postgres. Nó được gắn thẻ SQL Server nên câu trả lời này không chính xác.
Martin Smith

Bạn nói đúng, nhưng nó vẫn giúp tôi và tôi nghĩ đó là một nhận xét hữu ích cho những người tìm thấy câu hỏi thông qua Google. Tiêu đề của câu hỏi không làm rõ nó là máy chủ cơ sở dữ liệu nào.
Aron Lorincz

1

Tôi đã viết điều này để tôi có thể chỉnh sửa tất cả các bảng và cột thành null cùng một lúc:

select 
case
when sc.max_length = '-1' and st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(MAX) NULL'
when st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(' + cast(sc.max_length as varchar(4)) + ') NULL'
else
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + ' NULL'
end as query
from sys.columns sc
inner join sys.types st on st.system_type_id = sc.system_type_id
inner join sys.objects so on so.object_id = sc.object_id
where so.type = 'U'
and st.name <> 'timestamp'
order by st.name

1

Đây là cách tiếp cận để làm điều này: -

  1. Kiểm tra xem bảng hoặc cột tồn tại hay không.
  2. Nếu có, sau đó thay đổi cột. ví dụ:-
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE 
            TABLE_CATALOG = 'DBName' AND 
            TABLE_SCHEMA = 'SchemaName' AND
            TABLE_NAME = 'TableName' AND
            COLUMN_NAME = 'ColumnName')
BEGIN
    ALTER TABLE DBName.SchemaName.TableName ALTER COLUMN ColumnName [data type] NULL
END  

Nếu bạn không có lược đồ nào thì hãy xóa dòng lược đồ vì bạn không cần đưa ra lược đồ mặc định.


0

Vì vậy, cách đơn giản nhất là,

alter table table_name change column_name column_name int(11) NULL;
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.