किसी मौजूदा कॉलम के लिए डिफ़ॉल्ट मान कैसे सेट करें


375

यह SQL Server 2008 में काम नहीं कर रहा है:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

त्रुटि है:

'SET' कीवर्ड के पास गलत सिंटैक्स।

मैं क्या गलत कर रहा हूं?


1
MSDN ALTER TABLE के बारे में आपने क्या कहा ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn



1
वह mysql सिंटेक्स है।
बेंजामिन गुडाक्रे

हर कोई सिर्फ एक मानक के लिए क्यों नहीं रह सकता है? (एक वास्तविक सवाल नहीं, सभी लोग Microsoft और mysql या अन्य विक्रेताओं का जिक्र करते हैं)। क्या ऐसा करने का कोई एनी / आइसो मानक तरीका भी है?
२१

जवाबों:


566

यह SQL सर्वर में काम करेगा:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
एक बाधा नाम निर्दिष्ट करने के लिए +1, इसलिए SQL सर्वर एक यादृच्छिक नहीं बनाता है।
हार्डकोड जूल 22'11

36
MSSQL डिफ़ॉल्ट मान "बाधा" कहने के लिए अजीब है। कुछ भी हो, वे विश्राम हैं ; एक बाधा के विपरीत ! वे अधिक चीजों को वैध बनाते हैं, कम नहीं।
रोमन स्टार्कोव

4
यदि आप एक वैकल्पिक तरीके से सोचते हैं तो यह अजीब नहीं है: यदि आप कॉलम निर्दिष्ट नहीं करते हैं तो डिफ़ॉल्ट बाधा MSSQL को एक त्रुटि फेंकने से रोकती है। तो यह उपयोगकर्ता के लिए बाधा नहीं है, लेकिन MSSQL के लिए एक बाधा है।
जॉनी पियाज़ी

4
यह केवल तभी काम करता है जब स्तंभ पर कोई मौजूदा डिफ़ॉल्ट बाधा नहीं है।
pmcreareavy

4
@fallenidol यह केवल तभी काम करता है जब स्तंभ पर कोई मौजूदा डिफ़ॉल्ट बाधा नहीं है। सही है, क्योंकि परिभाषा के अनुसार आपके पास एक से अधिक डिफ़ॉल्ट मान नहीं हो सकते ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
यह MSSQL में काम करता है, लेकिन इसका नुकसान यह है कि यह बाधा का नाम नहीं देता है कि यह पर्दे के पीछे बनाता है (ऊपर उच्च मतदान जवाब देखें)।
कंटैंगो

10
@ कोंटांगो मुझे लगता है कि आप उनमें से किसी एक को संशोधित करने की जरूरत है कि हर एक बाधा पर नामकरण परेशान नहीं करने के लिए बेहतर है। बस स्वचालित रूप से नामित बाधाओं को छोड़ने के लिए एक प्रक्रिया लिखें और आपको कभी भी एक नाम नहीं देना होगा + अन्य सभी अनाम लोगों के साथ सौदा कर सकते हैं
जॉनी राया

3
@ जॉनी लीड्स अच्छी बात। मैं बाधाओं को भी नाम देना पसंद करता हूं, क्योंकि यह डेटाबेस स्कीमा को संशोधित करने (या बस समझने) की कोशिश करने वाले किसी और के लिए अच्छा दस्तावेज है। यह कम महत्वपूर्ण है अगर कोई एक एकल ऑपरेटर एक टीम में काम कर रहा है।
कंटैंगो

1
(ईईएसएच! लाइन फीड्स की कमी के बारे में खेद है - स्पष्टता के लिए नीचे चिपकाया गया!) मुझे इसकी पुन: प्रयोज्य होने की आवश्यकता थी और यह जांचने का तरीका मिल गया कि क्या यह पहले से ही किया गया था ... IF EXISTS (Select * FROM information-schema.columns WHERE table_name = 'myTable' और column_name = 'myColumn' और table_schema = 'myDBO' और column_default IS NULL) BEGIN ALTER TABLE [myDBO]। [myTable] ADD DEFAULT 0 के लिए [myColumn] END
Dave

4
यदि केवल एक डिफ़ॉल्ट बाधा है ... तो आपको इसका नाम क्यों देना होगा? ऐसा लगता है कि अन्य डेटाबेस इंजन स्तंभ नाम के अलावा किसी भी नाम के बिना कॉलम के लिए डिफ़ॉल्ट मान को जोड़ने, अपडेट करने, हटाने के लिए वाक्यविन्यास प्रदान करते हैं, जो समझ में आता है। यदि कोई डिफ़ॉल्ट पहले से मौजूद है, तो उपरोक्त कोड विफल, btw, है। यह हास्यास्पद है कि SQL सर्वर को केवल डिफ़ॉल्ट बाधा के नाम की पहचान करने के लिए एक सिस्टम टेबल के खिलाफ एक जटिल जुड़ने की आवश्यकता होती है, जो आवश्यक नहीं होना चाहिए क्योंकि एक स्तंभ पर केवल एक डिफ़ॉल्ट बाधा हो सकती है।
त्रिकोको

51

इसके लिए परिवर्तन स्तंभ का उपयोग नहीं कर सकते, इसके बजाय ऐड का उपयोग करें

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
पता नहीं क्यों यह जवाब नहीं मिलता है। यह पहले वाले के समान ही है और पहले उत्तर दिया गया था ...
spankmaster79

30

ऐसा करने का सही तरीका इस प्रकार है:

  1. कमांड चलाएँ:

    sp_help [table name] 
  2. का नाम कॉपी करें CONSTRAINT

  3. ड्रॉप DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. नीचे कमांड चलाएँ:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com केवल अंग्रेजी भाषा है। पुर्तगाली साइट pt.stackoverflow.com
मार्टिन स्मिथ

यह अन्य उत्तरों के लिए कुछ भी नया नहीं जोड़ता है, एक मैनुअल तरीका है - जिसे स्क्रिप्ट नहीं किया जा सकता है, और यह "सही तरीका" के रूप में बताता है ..
आंद्रे फिग्यूएरेडो

12

हूडिकटस का समाधान एकदम सही था, धन्यवाद, लेकिन मुझे भी इसे फिर से चलाने योग्य बनाने की आवश्यकता थी और यह जांचने का तरीका मिल गया कि क्या यह किया गया था ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

7

दो परिदृश्य हैं जहां एक कॉलम के लिए डिफ़ॉल्ट मान को बदला जा सकता है,

  1. तालिका बनाने के समय
  2. किसी मौजूदा तालिका के लिए मौजूदा कॉलम को संशोधित करें।

  1. टेबल बनाने / नया कॉलम बनाने के समय।

सवाल

create table table_name
(
    column_name datatype default 'any default value'
);
  1. किसी मौजूदा तालिका के लिए मौजूदा कॉलम को संशोधित करें

इस स्थिति में मेरा SQL सर्वर मौजूदा डिफ़ॉल्ट बाधा मान को संशोधित करने की अनुमति नहीं देता है। इसलिए डिफ़ॉल्ट मान को बदलने के लिए हमें मौजूदा सिस्टम जनरेटेड या उपयोगकर्ता जनित डिफ़ॉल्ट बाधा को हटाना होगा। और उसके बाद एक विशेष कॉलम के लिए डिफ़ॉल्ट मान सेट किया जा सकता है।

कुछ चरणों का पालन करें:

  1. कॉलम के लिए सभी मौजूदा डिफ़ॉल्ट मान बाधाओं की सूची बनाएं।

इस सिस्टम डेटाबेस प्रक्रिया को निष्पादित करें, यह एक पैरामीटर के रूप में तालिका का नाम लेता है। यह तालिका के भीतर सभी स्तंभों के लिए सभी बाधाओं की सूची देता है।

execute [dbo].[sp_helpconstraint] 'table_name'
  1. एक कॉलम के लिए मौजूदा डिफ़ॉल्ट बाधा ड्रॉप करें।

वाक्य - विन्यास:

alter table 'table_name' drop constraint 'constraint_name'
  1. उस कॉलम के लिए नया डिफ़ॉल्ट मान बाधा जोड़ें:

वाक्य - विन्यास:

alter table 'table_name' add default 'default_value' for 'column_name'

चीयर्स @ !!!


5

यदि कोई प्रतिबंध पहले से ही अपने डिफ़ॉल्ट नाम के साथ मौजूद है:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;


4

आप सिंटैक्स का उपयोग कर सकते हैं, अधिक जानकारी के लिए यह प्रश्न और उत्तर देखें: SQL सर्वर में मौजूदा तालिका में एक डिफ़ॉल्ट मान के साथ एक स्तंभ जोड़ें

वाक्य - विन्यास :

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

उदाहरण :

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

दूसरा रास्ता :

तालिका पर राइट क्लिक करें और डिज़ाइन पर क्लिक करें, फिर उस कॉलम पर क्लिक करें जिसे आप डिफ़ॉल्ट मान सेट करना चाहते हैं।

फिर पृष्ठ के नीचे एक डिफ़ॉल्ट मान या बाइंडिंग जोड़ें: स्ट्रिंग के लिए '1' या इंट के लिए 1 जैसा कुछ।


3

बस पहले से मौजूद स्तंभ को बदलने के लिए 3 सरल चरणों को मिला जो पहले अशक्त था

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

पहली बूंद अड़चन

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

दूसरा डिफ़ॉल्ट मान बनाएँ

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]


1

जैसे चेक के साथ यक का उत्तर स्क्रिप्ट को बिना त्रुटि के एक से अधिक बार चलाने की अनुमति देता है। (information_schema.columns का उपयोग करने से कम कोड / कस्टम स्ट्रिंग्स)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.