Modifier la table: comment changer l'attribut «Autoriser les valeurs nulles» de non nul pour autoriser null

207

Comment changer un attribut dans une table en utilisant T-SQL pour autoriser les nulls (pas null -> null)? Modifier la table peut-être?

CrazyMouse
la source
12
SQL Server Management Studio crée un script très complexe pour une tâche aussi simple. C'est pourquoi je suis devenu confus et j'ai vérifié stackoverflow. Peut-être que c'est le point de la question ...
Tillito

Réponses:

363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL
LukeH
la source
4
Ou tout ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)comme il autorisera par défaut les valeurs NULL de toute façon, sauf indication contraire explicite.
Martin Smith
3
Notez que si vous avez besoin de modifier plusieurs colonnes pour autoriser null, vous devrez alors exécuter des ALTER TABLE .. ALTER COLUMN ..commandes distinctes
sonyisda1
2
Notez qu'il y a des cas où cela pourrait ne pas fonctionner - voir cette réponse DBA Stack Exchange si vous obtenez unALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon
49

Oui, vous pouvez utiliser ALTER TABLEcomme suit:

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

Citant de la ALTER TABLEdocumentation:

NULLpeut être spécifié dans ALTER COLUMNpour forcer une NOT NULLcolonne à autoriser les valeurs nulles, à l'exception des colonnes dans les contraintes PRIMARY KEY.

Daniel Vassallo
la source
22

ALTER TABLE a raison:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL
Oded
la source
2
Voulez-vous vraiment redéfinir les contraintes et uniquement le type de données? L'article MSDN ne mentionne pas que les contraintes doivent être redéfinies: "Si NULL ou NOT NULL est spécifié avec ALTER COLUMN, new_data_type [(precision [, scale])] doit également être spécifié. Si le type de données, la précision et l'échelle n'est pas modifiée, spécifiez les valeurs de colonne actuelles. "
Daniel Vassallo
@Daniel Vassallo - Vous avez raison. J'essayais d'être complet, mais changer NULL / NOT NULL devrait être le seul changement.
Odé
5

Pour MySQL, MariaDB

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

Utilisez MODIFY COLUMNau lieu de ALTER COLUMN.

Vijay Nandwana
la source
4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;
laxmi kalake
la source
2
@ ÁronLőrincz cependant, la question ne concerne pas Postgres. Il est étiqueté SQL Server, donc cette réponse est incorrecte.
Martin Smith
Vous avez raison, mais cela m'a quand même aidé et je pense que c'est un commentaire utile pour les personnes qui trouvent la question via Google. Le titre de la question ne précise pas de quel serveur de base de données il s'agit.
Aron Lorincz
1

J'ai écrit ceci afin que je puisse éditer toutes les tables et colonnes à null à la fois:

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
Jeffrey Pallatt
la source
1

Voici l'approche pour ce faire: -

  1. Vérifiez si la table ou la colonne existe ou non.
  2. Si oui, modifiez la colonne. par exemple:-
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  

Si vous n'avez pas de schéma, supprimez la ligne de schéma car vous n'avez pas besoin de donner le schéma par défaut.

Tilak Dewangan
la source
0

Donc, le moyen le plus simple est,

alter table table_name change column_name column_name int(11) NULL;
Mohsin Younas
la source