मौजूदा स्तंभ के मान के बराबर डिफ़ॉल्ट मान वाली तालिका में एक स्तंभ जोड़ें


90

SQL सर्वर तालिका में एक डिफ़ॉल्ट मान के साथ एक स्तंभ कैसे जोड़ें जो किसी मौजूदा स्तंभ के मान के बराबर है?

मैंने इस T-SQL स्टेटमेंट की कोशिश की:

ALTER TABLE tablename 
ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

लेकिन यह एक त्रुटि दे रहा है:

इस संदर्भ में "ओल्डकॉम्बुलम" नाम की अनुमति नहीं है। वैध अभिव्यक्तियाँ स्थिरांक, स्थिर अभिव्यक्ति और (कुछ संदर्भों में) चर हैं। कॉलम नामों की अनुमति नहीं है।


6
डिफ़ॉल्ट मान एक स्थिर हो सकता है, दूसरा स्तंभ नहीं। मुझे लगता है कि एक ट्रिगर की जरूरत है।
ypercube y

1
ठीक है, मैं यह कैसे कर सकता हूं, मैं sql में नया हूं।
डिडोस

1
क्या यह हमेशा डिफ़ॉल्ट होने वाला है, या यह सिर्फ मौजूदा पंक्तियों के लिए कॉलम को आबाद करने के लिए है जबकि नए कॉलम को तालिका में जोड़ा जा रहा है?
डेमियन_इन_उन्नीवर 11

1
@Damien_The_Unbeliever मौजूदा पंक्तियों के लिए कॉलम को पॉप्युलेट करने के लिए।
12

2
आपको इसे एक अलग के रूप में करना होगा UPDATE, मुझे डर है।
डेमियन_इन_यूएनबेलिवर

जवाबों:


73

इसे इस्तेमाल करे:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0)
Go
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0
Go

5
..हाँ, लेकिन यह केवल मौजूदा पंक्तियों के लिए काम करेगा। नई पंक्तियों को सम्मिलित करने पर यह [newcolumn] मान सेट नहीं करेगा। आपको INSERT ट्रिगर आदि के बाद की जरूरत है
मिलान

14
यह मेज पर संभवतः एक अनपेक्षित डिफ़ॉल्ट बाधा जोड़ता है
रोमेन वेगनोरी

1
@RomainVergnory मैं सहमत हूँ, यह बेहतर है कि बिना किसी रोक-टोक के पहले न जाएँ, फिर मौजूदा कॉलम के साथ मूल्यों को आबाद करें और बाद में फिर से NULL न जोड़ें
adkl

15

मैं उन्हें बहुत पसंद नहीं करता, लेकिन यहां बताया गया है कि आप एक AFTER INSERTट्रिगर के साथ ऐसा कैसे कर सकते हैं :

CREATE TRIGGER TableX_AfterInsert_TRG 
  ON TableX 
AFTER INSERT
AS
  UPDATE TableX AS t
  SET t.newcolumn = t.oldcolumn
  FROM Inserted AS i
  WHERE t.PK = i.PK ;              -- where PK is the PRIMARY KEY of the table   

13

AFTER INSERTट्रिगर दृष्टिकोण अतिरिक्त की वजह से भूमि के ऊपर शामिल UPDATEबयान। मैं एक INSTEAD OF INSERTट्रिगर का उपयोग करने का सुझाव देता हूं , जो निम्नानुसार है:

CREATE TRIGGER tablename_on_insert ON tablename 
INSTEAD OF INSERT 
AS
INSERT INTO tablename (oldcolumn, newcolumn)
SELECT oldcolumn, ISNULL(newcolumn, oldcolumn)
FROM inserted

यह तब काम नहीं करता है जब कि oldcolumnएक ऑटो-पहचान कॉलम है।


2
INSTEAD OFट्रिगर्स भी काम नहीं करते हैं जब लौकिक तालिकाओं का उपयोग करें:SYSTEM_VERSIONING = ON
केल्विनडेल

3

कपिल के उत्तर का विस्तार करने के लिए , और अवांछित डिफ़ॉल्ट बाधा से बचने के लिए, यह प्रयास करें:

ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999
Go
Update tablename SET newcolumn = oldcolumn
Go
ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN
Go

यदि आपके प्रकार varchar, nvarchar, datetime, ... या अन्य प्रकारों के लिए किसी भी संगत डेटा द्वारा: 'noData' द्वारा प्रतिस्थापित -9999 है: विशिष्ट मूल्य कोई फर्क नहीं पड़ता, यह 2 निर्देश द्वारा मिटा दिया जाएगा।


1

आप मौजूदा स्तंभ मान के आधार पर तालिका में नए स्तंभ सम्मिलित करने के लिए कंप्यूटेड कॉलम का उपयोग कर सकते हैं

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;

या, यदि आप मौजूदा कॉलम मान के आधार पर मूल्य में कुछ बदलाव करना चाहते हैं, तो उपयोग करें

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;

0

मेरे मामले के लिए, मैं CODE नामक एक नया नॉट अद्वितीय कॉलम जोड़ना चाहता हूं, लेकिन मुझे निर्माण समय पर मूल्य के बारे में पता नहीं है। मैंने NewID से डिफ़ॉल्ट मान प्राप्त करके इसके लिए डिफ़ॉल्ट मान सेट किया () फिर बाद में अपडेट करें।

ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5))

ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])

-3

मुझे लगता है कि यदि आप उपयोग करते हैं Set Identity_Insert <TableName> OFFऔर आपके द्वारा लिखे गए सम्मिलित विवरण के बाद यह काम करेगा Set Identity_Insert <TableName> ON

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