แก้ไขตาราง: วิธีการเปลี่ยนแอตทริบิวต์ 'อนุญาต Nulls' จากไม่ใช่ null เพื่ออนุญาต null


207

วิธีการเปลี่ยนหนึ่งคุณลักษณะในตารางโดยใช้ T-SQL เพื่ออนุญาตให้มีค่า Null (ไม่ใช่ Null -> Null) ตารางการเปลี่ยนแปลงอาจจะ?


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)มันจะเริ่มต้นเพื่อให้เป็นโมฆะอย่างไรก็ตามถ้าไม่ได้ระบุไว้เป็นอย่างอื่นอย่างชัดเจน
Martin Smith

3
หมายเหตุหากต้องการเปลี่ยนหลายคอลัมน์เพื่ออนุญาตให้เป็นโมฆะคุณจะต้องดำเนินการALTER TABLE .. ALTER COLUMN ..คำสั่งแยกต่างหาก
sonyisda1

2
โปรดทราบว่ามีบางกรณีที่สิ่งนี้อาจไม่ทำงาน - ดูคำตอบ DBA Stack Exchange นี้หากคุณได้รับ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คอลัมน์อนุญาตให้มีค่า Null ยกเว้นสำหรับคอลัมน์ในข้อ จำกัด KEY KEY


22

ALTER TABLEถูกต้อง:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
คุณแน่ใจหรือว่าต้องการกำหนดข้อ จำกัด อีกครั้งและเป็นเพียงประเภทข้อมูล บทความ MSDNไม่ได้กล่าวถึงข้อ จำกัด ที่จะต้องมีการกำหนดใหม่: "หากระบุ NULL หรือไม่เป็น NULL ด้วย ALTER COLUMN ต้องระบุ new_data_type [(ความแม่นยำ [, สเกล]]] ถ้าชนิดข้อมูลความแม่นยำและ สเกลจะไม่เปลี่ยนแปลงให้ระบุค่าคอลัมน์ปัจจุบัน "
Daniel Vassallo

@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 ดังนั้นคำตอบนี้ไม่ถูกต้อง
Martin Smith

คุณพูดถูก แต่ก็ยังช่วยฉันได้และฉันคิดว่านี่เป็นความคิดเห็นที่มีประโยชน์สำหรับผู้ที่พบคำถามผ่านทาง Google ชื่อของคำถามไม่ได้ทำให้ชัดเจนว่าเป็นเซิร์ฟเวอร์ฐานข้อมูลใด
Aron Lorincz

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  

หากคุณไม่มีสคีมาให้ลบบรรทัดสคีมาออกเพราะคุณไม่จำเป็นต้องให้สคีมาเริ่มต้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.