Змінити таблицю: Як змінити атрибут '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.