Змінити таблицю: Як змінити атрибут 'Allow Nulls' з не null, щоб дозволити null


207

Як змінити один атрибут у таблиці за допомогою T-SQL, щоб дозволити нулі (не null -> null)? Можливо, змінити таблицю?


12
Студія управління SQL Server створює дуже складний сценарій для такого простого завдання. Тому я розгубився і перевірив stackoverflow. Можливо, в цьому і полягає питання ...
Tillito

Відповіді:


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

4
Або так само, ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)як і за замовчуванням дозволити дозволити нулі в будь-якому випадку, якщо явно не вказано інше.
Мартін Сміт

3
Зверніть увагу, якщо вам потрібно змінити кілька стовпців, щоб дозволити нуль, тоді вам потрібно буде виконати окремі ALTER TABLE .. ALTER COLUMN ..команди
sonyisda1

2
Зауважте, що є деякі випадки, коли це може не працювати - дивіться цю відповідь на обмін стеками DBA, якщо ви отримуєтеALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon

49

Так, ви можете використовувати ALTER TABLEнаступне:

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

Цитування з ALTER TABLEдокументації:

NULLможна вказати в, ALTER COLUMNщоб примусити NOT NULLстовпець дозволити нульові значення, за винятком стовпців у обмеженнях PRIMARY KEY.


22

ALTER TABLE правильно:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
Ви впевнені, що вам потрібно переосмислити обмеження та лише тип даних? У статті MSDN не зазначається, що обмеження потрібно буде переосмислити: "Якщо NULL або NOT NULL задано ALTER COLUMN, також слід вказати new_data_type [(точність [, шкала])]. Якщо тип даних, точність та шкала не змінюється, вкажіть поточні значення стовпця. "
Даніель Вассалло

@Daniel Vassallo - Ви маєте рацію. Я намагався бути повноцінним, але зміна NULL / NOT NULL має бути єдиною зміною.
Oded


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

2
@ ÁronLőrincz питання не в Postgres. Він позначений тегом SQL Server, тому ця відповідь є невірною.
Мартін Сміт

Ви маєте рацію, але це все-таки мені допомогло, і я вважаю, що це корисний коментар для людей, які знаходять питання через Google. Заголовок питання не дає зрозуміти, про який саме сервер бази даних йдеться.
Арон Лорінц

1

Я написав це, щоб я міг редагувати всі таблиці та стовпці до нуля відразу:

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

Це такий підхід:

  1. Перевірте, чи існує таблиця чи стовпець чи ні.
  2. Якщо так, то змініть стовпчик. наприклад: -
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  

Якщо у вас немає схеми, видаліть рядок схеми, оскільки не потрібно давати схему за замовчуванням.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.