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


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.