ฉันสามารถสร้างข้อ จำกัด เริ่มต้นที่มีชื่อในคำสั่งเพิ่มคอลัมน์ใน SQL Server ได้หรือไม่


163

ใน SQL Server ฉันมีคอลัมน์ใหม่ในตาราง:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

สิ่งนี้ล้มเหลวเนื่องจากฉันระบุ NOT NULL โดยไม่ระบุข้อ จำกัด เริ่มต้น ตารางไม่ควรมีข้อ จำกัด เริ่มต้น

ในการหลีกเลี่ยงปัญหานี้ฉันสามารถสร้างตารางด้วยข้อ จำกัด เริ่มต้นแล้วลบออก

อย่างไรก็ตามไม่มีวิธีใดที่จะระบุว่าข้อ จำกัด เริ่มต้นควรตั้งชื่อเป็นส่วนหนึ่งของคำสั่งนี้ดังนั้นวิธีเดียวที่ฉันจะกำจัดมันคือการมีขั้นตอนการจัดเก็บที่ค้นหาใน sys.default_constraints ตาราง.

นี่เป็นสิ่งที่ยุ่งเล็กน้อย / verbose สำหรับการดำเนินการที่มีแนวโน้มที่จะเกิดขึ้นมากมาย ไม่มีใครมีวิธีแก้ปัญหาที่ดีกว่านี้?

คำตอบ:


224

สิ่งนี้น่าจะใช้ได้:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL

1
ทำงานในปี 2012 ด้วย รายละเอียดเลือด: msdn.microsoft.com/en-us/library/ms187742.aspx
adam77

10
ทำไมไม่ใส่NOT NULLติดกับชนิดข้อมูล? มันอาจจะถูกต้องตามหลัก syntactically ที่จะวางไว้หลังข้อ จำกัด แต่ดูเหมือนว่ามันสับสนที่จะวางไว้ที่นั่น
Tullo_x86

102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)

22
ฉันชอบสิ่งนี้กับคำตอบที่ยอมรับเนื่องจากฉันสามารถปล่อยข้อ จำกัด เริ่มต้นได้โดยไม่ต้องกังวลว่าจะสูญเสียข้อ จำกัด NOT NULL
EleventhDoctor

7
@EventventorDoctor นั่นไม่สมเหตุสมผล NOT NULL ไม่ได้เป็นส่วนหนึ่งของข้อ จำกัด และคำสั่งปล่อยเพียงอ้างอิงชื่อข้อ จำกัด
Roger Willcocks

11
@RogerWillcocks คุณพูดถูก แต่ชัดเจนกว่าเมื่ออ่านแล้วว่า NOT NULL แยกออกจากข้อ จำกัด
deluxxxe

10

ฉันต้องการเพิ่มรายละเอียดเนื่องจากคำตอบที่มีอยู่ค่อนข้างบาง :

คำแนะนำที่สำคัญที่สุดคือ: คุณไม่ควรสร้างข้อ จำกัด โดยไม่มีชื่อชัดเจน!

ปัญหาที่ใหญ่ที่สุดที่มีข้อ จำกัด ที่ไม่มีชื่อ : เมื่อคุณเรียกใช้งานบนเครื่องลูกค้าที่หลากหลายคุณจะได้รับชื่อที่แตกต่างกันไปในแต่ละชื่อ
ใด ๆสคริปต์การอัพเกรดในอนาคตจะมีอาการปวดหัวจริง ...

คำแนะนำทั่วไปคือ:

  • ไม่มีข้อ จำกัด หากไม่มีชื่อ!
  • ใช้หลักการตั้งชื่อบางอย่างเช่น
    • DF_TableName_ColumnName สำหรับข้อ จำกัด เริ่มต้น
    • CK_TableName_ColumnName สำหรับข้อ จำกัด การตรวจสอบ
    • UQ_TableName_ColumnName สำหรับข้อ จำกัด ที่ไม่ซ้ำกัน
    • PK_TableName สำหรับข้อ จำกัด คีย์หลัก

ไวยากรณ์ทั่วไปคือ

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

ลองที่นี่

คุณสามารถเพิ่มข้อ จำกัด เพิ่มเติมในแต่ละคอลัมน์และคุณสามารถเพิ่มข้อ จำกัด เพิ่มเติมเช่นเดียวกับที่คุณเพิ่มคอลัมน์หลังเครื่องหมายจุลภาค:

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

- แทรกข้อมูลบางส่วน

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);

1

ลองเหมือนสคริปต์ด้านล่าง

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.