जवाबों:
हालांकि मुझे लगता है कि आपने पहले ही कॉलम बना लिया है, इस उत्तर में मैं यह मानकर चल रहा हूं कि कॉलम अभी तक मौजूद नहीं है। आईएमओ, एक अद्वितीय आवश्यक कॉलम को बिना योजना के जोड़ा नहीं जाना चाहिए कि पहले मौजूदा पंक्तियों को कैसे आबाद किया जाए। इसलिए, मैं इसे शून्य से शुरू करने के लिए तरीके प्रदान करूंगा।
आप यह कैसे करते हैं यह इस बात पर निर्भर करता है कि मूल्यों को आबाद करने में क्या शामिल है।
जो भी विधि आप उपयोग करते हैं, उसके बाद डेटा अखंडता सुनिश्चित करने के लिए स्तंभ पर एक अद्वितीय बाधा जोड़ें। मेथड्स 1 और 2 के लिए, यह एकल स्टेटमेंट के भीतर या यूजर ट्रांजैक्शन (दिखाया नहीं गया) के भीतर किया जा सकता है, और मेथड 3 में यूजर ट्रांजैक्शन के भीतर किया जाना चाहिए।
ऐसा करने के कुछ अन्य अस्पष्ट तरीके हैं, लेकिन मुझे लगता है कि मैंने सबसे आम कवर किया है।
विधि 1: एक पहचान स्तंभ जोड़ें
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
यह तालिका में सभी पंक्तियों को अलग-अलग मानों के साथ बीज मान (1) से शुरू करेगा, जो प्रत्येक पंक्ति के लिए वृद्धि मूल्य (2) से बढ़ेगा। मेरा मानना है कि जिन मूल्यों को आबादी प्राप्त होती है वह अपरिभाषित है (यदि आपको कोई आदेश निर्दिष्ट करना है, तो विधि 3 का उपयोग करें)।
विधि 2: एक डिफ़ॉल्ट बाधा का उपयोग कर आबाद करें
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
यह तीन चीजें परमाणु से करेगा: 1. एक कॉलम जोड़ें जो NULLमानों की अनुमति नहीं देता है; 2. कॉलम के लिए एक डिफ़ॉल्ट बाधा बनाएं; 3. डिफ़ॉल्ट बाधा का उपयोग करके तालिका में प्रत्येक पंक्ति को पॉप्युलेट करें।
हालांकि यह उदाहरण एक uniqueidentifierकॉलम का उपयोग करता है , यह किसी भी डेटा प्रकार और डिफ़ॉल्ट बाधा के साथ ही काम करता है।
विधि 3: एक अद्यतन कथन का उपयोग कर आबाद करें
यह मामला तब होगा, उदाहरण के लिए, आपके एप्लिकेशन के किसी अन्य भाग से एक मान था जिसे तालिका में जोड़ने की आवश्यकता है, या आपको अद्वितीय मानों के लिए एक सटीक क्रम निर्दिष्ट करने की आवश्यकता है।
BEGIN TRANSACTION
ALTER TABLE MyTable ADD MyColumn int NULL
UPDATE MyTable
SET MyColumn = ...
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL
COMMIT TRANSACTION
विधि 4: एक अनुक्रम वस्तु का उपयोग कर आबाद
SQL सर्वर 2012 के लिए, आप किसी SEQUENCEऑब्जेक्ट द्वारा उत्पन्न मानों का उपयोग करके एक कॉलम को पॉप्युलेट कर सकते हैं - मैंने अभी तक इसके साथ काम नहीं किया है, इसलिए मैं पूर्णता के लिए एक MSDN लेख का संदर्भ दूंगा ।
update mytable set mycolumn = next value for mysequence where mycolumn is null;
यदि आप 1 से शुरू होने वाली संख्या से खुश हैं तो आप उपयोग कर सकते हैं row_number()।
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
निम्नलिखित अद्यतन कॉलम 'cn' क्रम संख्या 1 से शुरू होता है
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
किसी अनुक्रम का उपयोग करके अपडेट करने के लिए इसे आज़माएं ... अपडेट स्टेटमेंट में क्लॉज़ द्वारा ऑर्डर करने के कारण आपको TOP करना होगा। मैंने इस कथन का उपयोग SQL SERVER 2012 पर किया था
update invoice set RecNo = (next value for seq_invoice_recno)
where invoiceid in (select top 100000 invoiceid from invoice where RecNo is null
order by invoiceId)
और अगर यह सब अभी भी काम नहीं करेगा (हो सकता है क्योंकि यह सादे पुराने एसक्यूएल -92 है), तो आप इसे कई चरणों में तोड़ सकते हैं, जैसा कि जिग्गी क्रूएल्टीफ्री ज़ेतिगेस्टर द्वारा सुझाया गया है ।
CREATE TABLE sorting (sid numeric(10,10), rn int);
INSERT INTO sorting (sid, rn)
SELECT SortID, RecordNumber FROM Beleg
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID;
UPDATE Beleg SET SortID = (SELECT rn FROM sorting WHERE sid=Beleg.SortID)
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210;
DROP TABLE sorting;
RecordNumber? एक मालिकाना फिल्म निर्माता समारोह / सुविधा की तरह लगता है। SQL सर्वर पर लागू नहीं होता है और SQL 92 मानक में नहीं होता है।
Filemakerइसलिए मुझे नहीं लगता कि उत्तर प्रासंगिक है। आप एक अस्थायी तालिका का उपयोग कर सकते हैं और उस कॉलम को ROW_NUMBER()फ़ंक्शन के साथ भर सकते हैं ।