क्या मैं SQL सर्वर में एक जोड़ कॉलम स्टेटमेंट में एक नामित डिफ़ॉल्ट बाधा बना सकता हूं?


163

SQL सर्वर में, मेरे पास टेबल पर एक नया कॉलम है:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

यह विफल रहता है क्योंकि मैं एक डिफ़ॉल्ट बाधा निर्दिष्ट किए बिना पूरा नहीं निर्दिष्ट करता हूं। तालिका में डिफ़ॉल्ट बाधा नहीं होनी चाहिए।

इसके आसपास जाने के लिए, मैं डिफ़ॉल्ट बाधा के साथ तालिका बना सकता हूं और फिर इसे हटा सकता हूं।

हालाँकि, यह निर्दिष्ट करने का कोई तरीका नहीं दिखता है कि डिफ़ॉल्ट बाधा को इस कथन के हिस्से के रूप में नामित किया जाना चाहिए, इसलिए इससे छुटकारा पाने का मेरा एकमात्र तरीका एक संग्रहीत प्रक्रिया है जो इसे sys.default_constts में दिखता है। तालिका।

यह एक ऑपरेशन के लिए थोड़ा गड़बड़ / क्रिया है जो बहुत कुछ होने की संभावना है। क्या किसी के पास इसके लिए कोई बेहतर उपाय है?

जवाबों:


224

यह काम करना चाहिए:

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

1
2012 में भी काम करता है। Gory विवरण: msdn.microsoft.com/en-us/library/ms187742.aspx
adam77

10
NOT NULLडेटा प्रकार के निकट क्यों नहीं रखा गया है ? हो सकता है कि यह बाधा के बाद इसे डालने के लिए वाक्य-रचना के लिए मान्य हो, लेकिन यह इसे वहां डालने के लिए भ्रमित करता है।
तुललो_एक्स

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

22
मैं स्वीकार किए गए उत्तर के लिए इसे पसंद करता हूं क्योंकि मैं बिना किसी बाधा के खोने के बारे में चिंता किए बिना डिफ़ॉल्ट बाधा को छोड़ सकता हूं।
ग्यारहवेंडॉक्टर

7
@EleventhDoctor कोई मतलब नहीं है। नॉट नाल बाधा का हिस्सा नहीं है और ड्रॉप स्टेटमेंट केवल बाधा नाम का संदर्भ देता है
रोजर विलकॉक्स

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.