แทรกคอลัมน์ NOT NULL ลงในตารางที่มีอยู่


122

ฉันเหนื่อย:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

แต่ให้ข้อความแสดงข้อผิดพลาดนี้:

ALTER TABLE อนุญาตให้เพิ่มคอลัมน์ที่สามารถมีค่าว่างหรือมีการกำหนดค่าเริ่มต้นที่ระบุไว้เท่านั้น

คำตอบ:


223

ในฐานะตัวเลือกที่คุณสามารถสร้างคอลัมน์ Null-able ในขั้นต้นจากนั้นอัปเดตคอลัมน์ตารางของคุณด้วยค่าที่ไม่ถูกต้องและสุดท้ายแก้ไขคอลัมน์เพื่อตั้งค่าข้อ จำกัด ที่ไม่ใช่ NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

อีกทางเลือกหนึ่งคือการระบุค่าเริ่มต้นที่ถูกต้องสำหรับคอลัมน์ของคุณ:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD: โปรดทราบว่าคำตอบข้างต้นมีGOสิ่งที่ต้องทำเมื่อคุณเรียกใช้รหัสนี้บนเซิร์ฟเวอร์ Microsoft SQL หากคุณต้องการดำเนินการเดียวกันบน Oracle หรือ MySQL คุณต้องใช้อัฒภาค;เช่นนั้น:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
โดยส่วนตัวแล้วฉันชอบวิธีแรกที่นี่หากคุณมีค่าที่คุณสามารถใส่ลงในฟิลด์ได้ด้วยตนเอง ด้วยวิธีนี้คุณไม่ต้องกังวลกับการสร้างและลบข้อ จำกัด เริ่มต้นโดยที่คุณไม่ต้องการ
Mark W Dickson

1
@acarlon - ฉันคิดว่าถึงแล้ว ข้อความที่เป็นอันตรายที่updateคุณกล่าวถึงจะเป็นอันตรายในคำถามใด ๆ ควรจะง่ายพอที่จะดูว่าคุณมีคอลัมน์พิเศษในupdateคำสั่งที่นี่หรือไม่ โดยทั่วไปคุณจะเพิ่มทีละคอลัมน์หรือสองคอลัมน์เท่านั้น หากคุณบังเอิญเพิ่มคอลัมน์พิเศษลงในupdateคำสั่งของคุณที่ไม่ได้อยู่ที่นั่นในตัวอย่างนี้คุณอาจไม่ควรรับผิดชอบข้อมูลตั้งแต่แรก
Mark W Dickson

2
นักพัฒนา ANDROID ที่ใช้ SQLite โปรดทราบว่าALTER COLUMNSQLite ไม่รองรับ
Sdghasemi

2
ฉันไม่เคยเห็นGOมาก่อนและดูเหมือนว่าจะไม่ใช่ส่วนหนึ่งของข้อกำหนด SQLดังนั้นจึงอาจนำไปสู่ความล้มเหลวสำหรับสคริปต์ที่ไม่ได้รับการดำเนินการโดยหนึ่งในเครื่องมือที่รองรับ ใช้แค่อัฒภาค? ฉันไม่แนะนำให้เผยแพร่มาตรฐานของ Microsoft เนื่องจากพวกเขาไม่ค่อยสนใจเกี่ยวกับมาตรฐานใด ๆ ที่เป็นที่ยอมรับและสมเหตุสมผล แต่คิดค้นของพวกเขาเองเพื่อให้มีการคิดค้นขึ้นเอง นอกเหนือจากนั้นคำตอบที่เป็นประโยชน์
Neonit

2
@ นีออนขอบคุณสำหรับความคิดเห็น แต่คำถามเดิมเกี่ยวกับเซิร์ฟเวอร์ MS SQL นั่นคือเหตุผลที่ GO อยู่ที่นั่น แต่ฉันจะเพิ่มหมายเหตุเกี่ยวกับเรื่องนี้ในคำตอบของฉัน
Pavel Morshenyuk

13

หากคุณไม่อนุญาตให้คอลัมน์เป็น Null คุณต้องระบุค่าเริ่มต้นเพื่อเติมข้อมูลแถวที่มีอยู่ เช่น

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

ใน Enterprise Edition นี่เป็นการเปลี่ยนแปลงเฉพาะข้อมูลเมตาตั้งแต่ปี 2012


2
คุณไม่จำเป็นต้องทำ แต่เป็นทางเลือกหนึ่ง
แมท

6

ข้อความแสดงข้อผิดพลาดค่อนข้างอธิบายได้ลอง:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

และความหมายของ "ลบ" ในส่วนเริ่มต้นคืออะไร?
Mladen B.

3

การใช้งาน SQL อื่น ๆ มีข้อ จำกัด ที่คล้ายกัน เหตุผลก็คือว่าการเพิ่มคอลัมน์ต้องเพิ่มค่าสำหรับคอลัมน์ที่ (เหตุผลแม้ว่าจะไม่ได้ร่างกาย) NULLซึ่งเริ่มต้น หากคุณไม่อนุญาตNULLและไม่มีไฟล์defaultมูลค่าจะเป็นเท่าไหร่?

เนื่องจาก SQL Server รองรับADD CONSTRAINTฉันจึงขอแนะนำแนวทางของ Pavel ในการสร้างคอลัมน์ที่เป็นโมฆะจากนั้นเพิ่มNOT NULLข้อ จำกัด หลังจากที่คุณเติมเต็มด้วยNULLค่าที่ไม่ใช่


MySQL รองรับการเพิ่มคอลัมน์ที่ไม่เป็นค่าว่างลงในตารางที่มีอยู่พร้อมข้อมูลโดยที่ค่าว่าง "เหมาะสม" สำหรับชนิดข้อมูลจะถูกป้อนลงในแถวที่มีอยู่ (เช่น 0.0 สำหรับ float, 0 สำหรับจำนวนเต็ม, สตริงว่างสำหรับสตริงเป็นต้น)
Michael Tsang

2

สิ่งนี้ใช้ได้ผลสำหรับฉันยังสามารถ "ยืม" จากมุมมองการออกแบบทำการเปลี่ยนแปลง -> คลิกขวา -> สร้างสคริปต์การเปลี่ยนแปลง

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT


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