การเปลี่ยนคอลัมน์: null เป็นไม่ null


1216

ฉันมีตารางที่มีคอลัมน์จำนวนเต็ม null จำนวนหนึ่ง นี้เป็นที่ไม่พึงประสงค์ด้วยเหตุผลหลายประการดังนั้นฉันกำลังมองหาเพื่อปรับปรุง nulls ทั้งหมด 0 NOT NULLและจากนั้นตั้งค่าคอลัมน์เหล่านี้ลง นอกเหนือจากการเปลี่ยนค่า Null เป็น0ข้อมูลจะต้องถูกเก็บรักษาไว้

ฉันกำลังมองหาไวยากรณ์ SQL เฉพาะเพื่อแก้ไขคอลัมน์ (เรียกว่าColumnA) เป็น " not null" สมมติว่าข้อมูลได้รับการปรับปรุงเพื่อไม่ให้มีค่าว่าง

ใช้SQL Server 2000


16
อีกอย่างหนึ่ง - คุณอาจต้องการเพิ่มค่าเริ่มต้นให้กับส่วนแทรกใด ๆ ที่มีอยู่ซึ่งไม่ได้ระบุคอลัมน์ไม่ได้ล้มเหลว: ALTER TABLE FOO เพิ่ม CONSTRAINT FOO_Bar_Default ค่าเริ่มต้น 0 สำหรับ Bar
Marc Gravell

4
นอกจากนี้คุณอาจประหลาดใจที่รู้ว่าในบางกรณีการเปลี่ยนคอลัมน์เพื่อNOT NULLทำให้เกิดการบันทึกจำนวนมาก
Martin Smith

คำตอบ:


2011

ก่อนอื่นให้ทำให้NULLค่าปัจจุบันทั้งหมดหายไป:

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

จากนั้นอัปเดตคำจำกัดความของตารางเป็นไม่อนุญาต "NULLs":

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

49
ให้ฉันเพิ่มมูลค่าให้กับคำตอบที่ถูกต้องสองข้อข้างต้น ความหมายของ NULL สามารถมีความหมายไม่กี่ หนึ่งในความหมายทั่วไปคือ UNKNOWN ใช้คะแนนเป็นตัวอย่าง คะแนนว่างและคะแนนศูนย์คือโลกที่แตกต่าง! ก่อนที่คุณจะทำตามคำแนะนำข้างต้น ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณไม่ได้ใช้ค่าว่างในตรรกะทางธุรกิจ
TechTravelThink

242
สำรองฐานข้อมูลของคุณก่อนในกรณีที่คุณพิมพ์ผิดและ DB ของคุณระเบิด
mpen

20
มันแปลก MS SQL Management Studio ไม่อนุญาตให้ตัวเลือกนั้นมันโม้เกี่ยวกับ "วางตาราง ... "
เซบาสเตียน

14
ฐานข้อมูลควรสำรองไว้เสมอ คุณไม่มีทางรู้ว่าเมื่อหนึ่งในคนของคุณอาจเขียนและอัปเดตหรือลบคำสั่งและลืมประโยคที่
Vivian River

2
@SebastianGodelet: มีการตั้งค่าที่ช่วยให้คุณสามารถปิดคำเตือนนั้นหรือตั้งค่าเพื่อไม่ให้คุณปรับเปลี่ยนตารางได้ ในบางกรณีการเปลี่ยนสคีมาของตารางต้องการให้สร้างตารางใหม่ข้อมูลที่คัดลอกมาจากตารางเก่าและตารางเก่าจะถูกลบ เนื่องจากข้อผิดพลาดในกระบวนการนี้อาจส่งผลให้ข้อมูลสูญหาย SSMS เตือนคุณและตามค่าเริ่มต้นจะป้องกันไม่ให้คุณทำเช่นนั้น
siride

57

ฉันมีปัญหาเดียวกัน แต่ฟิลด์ที่ใช้ในการเริ่มต้นเป็นโมฆะและตอนนี้ฉันต้องการเริ่มต้นที่ 0 ที่ต้องเพิ่มอีกหนึ่งบรรทัดหลังจากการแก้ปัญหาของ mdb:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

นี่ไม่ได้ตอบปัญหา มีการตั้งค่าเริ่มต้นไว้แล้วซึ่งเป็น NULL ที่จำเป็นต้องเปลี่ยน ด้วยคำตอบของคุณเท่านั้นระเบียนที่มีอยู่ทั้งหมดจะยังคงเป็น NULL และปัญหายังคงอยู่
PandaWood

6
คุณอ่านส่วนเกี่ยวกับ "การเพิ่มอีกหนึ่งบรรทัด" หรือไม่? ในขณะที่นี่คือนอกเหนือไปจากคำตอบข้างต้น?
Greg Dougherty

7
ที่จริงแล้วยังไม่ชัดเจนว่า "เพิ่มอีกหนึ่งบรรทัด" หมายถึง "นอกเหนือจากคำตอบข้างต้น" (โดยเฉพาะอย่างยิ่งเนื่องจากมีคำตอบมากมาย "เหนือ") - ถ้านั่นคือสิ่งที่คุณหมายถึงแล้วถ้อยคำต้องเปลี่ยนจริงๆและคุณควร รวมบรรทัดคำตอบที่คุณอ้างถึง
PandaWood

2
เพียงต้องการที่จะพูดสอดและพูดว่ามันเป็นความคิดที่ดีที่จะตั้งชื่อข้อ จำกัด ของคุณอย่างชัดเจนรวมถึงค่าเริ่มต้น หากคุณต้องการวางคอลัมน์คุณจะต้องรู้ชื่อของข้อ จำกัด ก่อนที่คุณจะสามารถทำได้ วิ่งเข้าไปหาสิ่งนี้ในการย้ายฐานข้อมูลของเราสองสามครั้ง ฉันรู้ว่าตัวอย่างรวมไว้ที่นี่ แต่ก็ยังคงเป็นสถานที่ที่นักพัฒนาบางคนเดินทางเพราะไม่จำเป็นต้องใช้ชื่อ
jocull

38

คุณจะต้องทำในสองขั้นตอน:

  1. อัปเดตตารางเพื่อไม่ให้มีค่าว่างในคอลัมน์
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. แก้ไขตารางเพื่อเปลี่ยนคุณสมบัติของคอลัมน์
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

สำหรับ Oracle 11g ฉันสามารถเปลี่ยนแอตทริบิวต์คอลัมน์ได้ดังนี้

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

มิฉะนั้นคำตอบของ abatichev ก็ดูดี คุณไม่สามารถแก้ไขซ้ำได้ - มันจะบ่น (อย่างน้อยก็ใน SQL Developer) ว่าคอลัมน์นั้นไม่เป็นโมฆะ


ปรากฏว่าใน Oracle 11 datatypeคุณจะได้ไม่ต้องทำซ้ำ เพียงcolumname NOT NULLก็เพียงพอ ดูเอกสาร
jpmc26


16

ตราบใดที่คอลัมน์ไม่ใช่ตัวระบุเฉพาะ

UPDATE table set columnName = 0 where columnName is null

แล้วก็

เปลี่ยนตารางและตั้งค่าฟิลด์เป็น non null และระบุค่าเริ่มต้นเป็น 0


4

สิ่งนี้ดูง่ายกว่า แต่ใช้ได้กับ Oracle เท่านั้น:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

นอกจากนี้คุณยังสามารถเพิ่มคอลัมน์ได้ไม่เพียงแค่ปรับเปลี่ยน มันอัพเดตเป็นค่าเริ่มต้น (0) ในตัวอย่างนี้ถ้าค่าเป็นโมฆะ


ใช่ แต่ google กำกับผู้คนที่นี่ .. มันทำให้เกิด upvotes มากมายและทำให้เกิด downwotes มากมาย ฉันคิดว่ามันมีประโยชน์ ทุกคนมีอิสระที่จะเพิกเฉยต่อสิ่งนี้ แต่ฉันคิดอย่างสุจริตและเห็นว่านี่คือการช่วยเหลือผู้คน
csomakk

กรุณาอ่านกฎของ SO ฉันจะเขียนคำตอบที่ดีได้อย่างไร , การตอบคำถามทางเทคนิคเป็นประโยชน์และเขียนคำถามที่สมบูรณ์แบบ หมายเหตุ: อย่ากลัวที่จะลบ (หรือแก้ไขอย่างหนัก) คำตอบที่ไร้ประโยชน์และอย่า“ ตอบและเรียกใช้
Kiquenet

4

ในกรณีที่FOREIGN KEY CONSTRAINT... จะมีปัญหาหาก '0' ไม่ปรากฏในคอลัมน์ของตารางคีย์หลัก ทางออกสำหรับ ...

ขั้นตอนที่ 1:

ปิดการใช้งานข้อ จำกัด ทั้งหมดโดยใช้รหัสนี้:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

ขั้นตอนที่ 2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

ขั้นตอนที่ 3:

เปิดใช้งานข้อ จำกัด ทั้งหมดโดยใช้รหัสนี้:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

4

ในกรณีของฉันฉันมีปัญหากับคำตอบที่โพสต์ ฉันลงเอยด้วยการใช้สิ่งต่อไปนี้:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

เปลี่ยนVARCHAR(200)เป็นประเภทข้อมูลของคุณและเลือกที่จะเปลี่ยนค่าเริ่มต้น

หากคุณไม่มีค่าเริ่มต้นคุณจะมีปัญหาในการเปลี่ยนแปลงนี้เนื่องจากค่าเริ่มต้นจะทำให้เกิดความขัดแย้ง


1

ลองมาตัวอย่าง:

TABLE NAME=EMPLOYEE

และฉันต้องการที่จะเปลี่ยนคอลัมน์ไปEMPLOYEE_NAME NOT NULLแบบสอบถามนี้สามารถใช้สำหรับงาน:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

โปรดอย่าตะโกนและใช้การจัดรูปแบบแทนเพื่อให้คุณโพสต์อ่านง่ายขึ้น เช่นช่วยให้รู้จักส่วนของรหัส stackoverflow.com/editing-help
Yunnosch

นอกจากนี้โปรดอย่าเขียนข้อความอีกต่อไปในตัวพิมพ์ใหญ่ทั้งหมด มันถือเป็นการตะโกนบนอินเทอร์เน็ต
โซอี้

1
@PawanTiwari โปรดแก้ไขแบบเต็ม ดูเหมือนว่าคุณจะไม่แก้ไขปัญหาทั้งหมดของโพสต์ ส่วนใหญ่จะเป็นตัวพิมพ์ใหญ่
ดับเบิ้ล

@ ดับเบิ้ลบี๊บแน่ฉันจะจำไว้ ขอบคุณ
Pawan Tiwari

นอกเหนือจากปัญหาการจัดรูปแบบแล้วโปรดอธิบายให้ชัดเจนยิ่งขึ้นว่าอะไรคือคำตอบเพิ่มเติมของคุณเช่นเมื่อเปรียบเทียบกับคำตอบเก่า ๆ ของ Ralph Wiggum, JDM, Rashmi Singh และ trooper31 ซึ่งดูเหมือนฟังก์ชั่นเหมือนกันในครั้งแรก ดูเหมือนว่าจำเป็นต้องชี้ให้เห็นจุดปลีกย่อยของการแก้ปัญหาของคุณ พยายามหลีกเลี่ยงความประทับใจในการคัดลอกคำตอบ ...
Yunnosch

0

สำหรับ inbuilt javaDB ที่รวมอยู่ใน JDK (การแจกจ่ายของ Apache Derby ของ Apache ที่สนับสนุน) ด้านล่างใช้งานได้สำหรับฉัน

alter table [table name] alter column [column name] not null;

0

การสร้างคอลัมน์ไม่เป็นโมฆะและการเพิ่มค่าเริ่มต้นสามารถทำได้ใน SSMS GUI

  1. ตามที่คนอื่นได้ระบุไว้แล้วคุณไม่สามารถตั้งค่า "ไม่เป็นโมฆะ" ได้จนกว่าข้อมูลที่มีอยู่ทั้งหมดจะเป็น "ไม่ว่าง" เช่น:

UPDATE myTable SET myColumn = 0

  1. เมื่อดำเนินการเสร็จแล้วด้วยตารางในมุมมองออกแบบ (คลิกขวาที่ตารางและคลิก "มุมมองออกแบบ") คุณสามารถยกเลิกการเลือกคอลัมน์อนุญาต Nullsดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

  1. ยังคงอยู่ในมุมมองออกแบบโดยมีการเลือกคอลัมน์คุณสามารถดู คุณสมบัติคอลัมน์ในหน้าต่างด้านล่างและตั้งค่าเริ่มต้นเป็น 0 ได้เช่นกัน:

ป้อนคำอธิบายรูปภาพที่นี่


ฉันเห็น downvote แต่ฉันไม่สามารถแก้ไขอะไรได้หากไม่มีคำติชม โปรดแจ้งให้เราทราบหากมีบางอย่างไม่ทำงาน
Tony L.

-1

คุณสามารถเปลี่ยนคำจำกัดความของคอลัมน์ฐานข้อมูลที่มีอยู่โดยใช้ sql ต่อไปนี้

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