Modifica tabella: come modificare l'attributo 'Consenti null' da non null a consentire null


207

Come modificare un attributo in una tabella usando T-SQL per consentire null (non null -> null)? Modificare la tabella forse?


12
SQL Server Management Studio crea uno script molto complesso per un'attività così semplice. Ecco perché mi sono confuso e controllato StackOverflow. Forse è questo il punto della domanda ...
Tillito,

Risposte:


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

4
O ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)come sarà predefinito per consentire comunque i null se non diversamente specificato esplicitamente.
Martin Smith,

3
Nota se è necessario modificare più colonne per consentire null, sarà necessario eseguire ALTER TABLE .. ALTER COLUMN ..comandi separati
sonyisda1

2
Nota che ci sono alcuni casi in cui questo potrebbe non funzionare - vedi questa risposta DBA Stack Exchange se ricevi un messaggioALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon

49

Sì, puoi usare ALTER TABLEcome segue:

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

Citando dalla ALTER TABLEdocumentazione:

NULLpuò essere specificato ALTER COLUMNper forzare una NOT NULLcolonna a consentire valori null, ad eccezione delle colonne nei vincoli PRIMARY KEY.


22

ALTER TABLE ha ragione:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
Sei sicuro di dover ridefinire i vincoli e solo il tipo di dati? L'articolo MSDN non menziona la necessità di ridefinire i vincoli: "Se si specifica NULL o NOT NULL con ALTER COLUMN, è necessario specificare anche new_data_type [(precision [, scale])]. Se il tipo di dati, la precisione e la scala non viene modificata, specifica i valori della colonna corrente. "
Daniel Vassallo,

@Daniel Vassallo - Hai ragione. Stavo cercando di essere completo, ma cambiare NULL / NOT NULL dovrebbe essere l'unica modifica.
Oded,

5

Per MySQL, MariaDB

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

Usa MODIFY COLUMNinvece di ALTER COLUMN.


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

2
@ ÁronLőrincz la domanda non riguarda Postgres. È taggato con SQL Server, quindi questa risposta non è corretta.
Martin Smith,

Hai ragione, ma mi ha ancora aiutato e penso che sia un commento utile per le persone che trovano la domanda tramite Google. Il titolo della domanda non chiarisce di quale server di database si tratti.
Aron Lorincz,

1

Ho scritto questo in modo da poter modificare tutte le tabelle e le colonne su null in una sola volta:

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

Questo è l'approccio per fare questo: -

  1. Controlla se la tabella o la colonna esiste o no.
  2. Se sì, allora modifica la colonna. per esempio:-
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  

Se non si dispone di uno schema, eliminare la riga dello schema perché non è necessario fornire lo schema predefinito.


0

Quindi il modo più semplice è

alter table table_name change column_name column_name int(11) NULL;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.