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.