ChatGPT解决这个技术问题 Extra ChatGPT

Modify table: How to change 'Allow Nulls' attribute from not null to allow null

How to change one attribute in a table using T-SQL to allow nulls (not null --> null)? Alter table maybe?

SQL Server Management Studio creates a very complex script for such a simple task. That's why I got confused and checked stackoverflow. Maybe that is the point of the question...

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

Or just ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42) as it will default to allowing nulls anyway if not specified explicitly otherwise.
Note if needing to change multiple columns to allow null, then you will need to perform separate ALTER TABLE .. ALTER COLUMN .. commands
Note there are some cases where this might not work - see this DBA Stack Exchange answer if you're getting an ALTER TABLE ALTER COLUMN failed because one or more objects access this column.
D
Daniel Vassallo

Yes you can use ALTER TABLE as follows:

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

Quoting from the ALTER TABLE documentation:

NULL can be specified in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints.


O
Oded

ALTER TABLE is right:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

Are you sure you need to re-define the constraints, and just the data type? The MSDN article doesn't mention that constraints would need to be redefined: "If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. If the data type, precision, and scale are not changed, specify the current column values."
@Daniel Vassallo - You are right. I was trying to be complete, but changing NULL/NOT NULL should be the only change.
V
Vijay Nandwana

For MySQL, MariaDB

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

Use MODIFY COLUMN instead of ALTER COLUMN.


s
slavoo
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;

@ÁronLőrincz the question is not about Postgres though. It is tagged SQL Server so this answer is incorrect.
You're right, but it still helped me and I think it's an useful comment for people who find the question via Google. The question's title doesn't make it clear which database server it is about.
J
Jeffrey Pallatt

I wrote this so I could edit all tables and columns to null at once:

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

T
Tilak Dewangan

This is the approach to do this: -

Check whether the table or column exists or not. If yes, then alter the column. e.g:-

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  

If you don't have any schema then delete the schema line because you don't need to give the default schema.


M
Mohsin Younas

So the simplest way is,

alter table table_name change column_name column_name int(11) NULL;