테이블 수정 : 널 허용을 위해 '널 허용'속성을 널이 아닌 값으로 변경하는 방법


207

null을 허용하기 위해 T-SQL을 사용하여 테이블에서 하나의 속성을 변경하는 방법 (널이 아님-> 널)? 어쩌면 테이블 변경?


12
SQL Server Management Studio는 이러한 간단한 작업을 위해 매우 복잡한 스크립트를 만듭니다. 그래서 혼란스러워서 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)명시 적으로 지정하지 않으면 null을 허용하도록 기본적으로 설정됩니다.
Martin Smith

3
null을 허용하기 위해 여러 열을 변경해야하는 경우 별도의 ALTER TABLE .. ALTER COLUMN ..명령 을 수행해야 합니다.
sonyisda1

2
이것이 작동하지 않는 경우도 있습니다.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 기사 에서는 제약 조건을 다시 정의해야한다고 언급하지 않습니다. "ALTER COLUMN으로 NULL 또는 NOT NULL을 지정하면 new_data_type [(precision [, scale])]도 지정해야합니다. 데이터 유형, 정밀도 및 배율이 변경되지 않았습니다. 현재 열 값을 지정하십시오. "
Daniel Vassallo

@Daniel Vassallo-당신 말이 맞아요. 완료하려고했지만 NULL / NOT NULL을 변경하는 것이 유일한 변경 사항입니다.
Oded

5

MySQL의 경우 MariaDB

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

MODIFY COLUMN대신에 사용하십시오 ALTER COLUMN.


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

2
@ ÁronLőrincz 문제는 Postgres에 관한 것이 아닙니다. SQL Server로 태그되어 있으므로이 답변이 잘못되었습니다.
Martin Smith

당신 말이 맞지만 여전히 도움이되었으며 Google을 통해 질문을 찾는 사람들에게 유용한 의견이라고 생각합니다. 질문의 제목은 어떤 데이터베이스 서버에 관한 것인지 명확하지 않습니다.
Aron Lorincz

1

이것을 작성하여 모든 테이블과 열을 한 번에 null로 편집 할 수 있습니다.

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  

스키마가없는 경우 기본 스키마를 제공 할 필요가 없으므로 스키마 행 을 삭제 하십시오.


0

가장 간단한 방법은

alter table table_name change column_name column_name int(11) NULL;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.