स्क्वेन्स नंबर / चार या किसी अनूठे डेटा के साथ मौजूदा पंक्तियों को अपडेट करें


13

मैंने टेबल X में एक नया कॉलम जोड़ा

इस कॉलम "cn" को अद्वितीय और अनिवार्य होना चाहिए, लेकिन पुराने डेटा का कोई मूल्य नहीं है।

अनुक्रमिक या यादृच्छिक अनन्य डेटा के साथ मौजूदा रिकॉर्ड कैसे अपडेट करें?

धन्यवाद।

जवाबों:


11

हालांकि मुझे लगता है कि आपने पहले ही कॉलम बना लिया है, इस उत्तर में मैं यह मानकर चल रहा हूं कि कॉलम अभी तक मौजूद नहीं है। आईएमओ, एक अद्वितीय आवश्यक कॉलम को बिना योजना के जोड़ा नहीं जाना चाहिए कि पहले मौजूदा पंक्तियों को कैसे आबाद किया जाए। इसलिए, मैं इसे शून्य से शुरू करने के लिए तरीके प्रदान करूंगा।


आप यह कैसे करते हैं यह इस बात पर निर्भर करता है कि मूल्यों को आबाद करने में क्या शामिल है।

जो भी विधि आप उपयोग करते हैं, उसके बाद डेटा अखंडता सुनिश्चित करने के लिए स्तंभ पर एक अद्वितीय बाधा जोड़ें। मेथड्स 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 लेख का संदर्भ दूंगा ।


धन्यवाद सब, मैं पहले जवाब के साथ एक संयोजन के साथ विधि 3 प्रयोग किया है: अद्यतन टी से सेट cn = आर.एन. (सीएन, ROW_NUMBER () से अधिक का चयन करें (आदेश से (1 TableX से आर.एन. के रूप में चयन))) टी
med_alpa

अनुक्रम का उपयोग करने का उदाहरण (यह मानते हुए कि आपके पास अनुक्रम है जिसे myfterence कहा जाता है):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

यदि आप 1 से शुरू होने वाली संख्या से खुश हैं तो आप उपयोग कर सकते हैं row_number()

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T


0

किसी अनुक्रम का उपयोग करके अपडेट करने के लिए इसे आज़माएं ... अपडेट स्टेटमेंट में क्लॉज़ द्वारा ऑर्डर करने के कारण आपको 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)

-1

और अगर यह सब अभी भी काम नहीं करेगा (हो सकता है क्योंकि यह सादे पुराने एसक्यूएल -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 मानक में नहीं होता है।
ypercube y

हाँ तुम सही हो। RecordNumber एक परिकलित स्तंभ है जिसे आप फिल्ममेकर में परिभाषित कर सकते हैं, जो स्क्रीन पर प्रदर्शित होने के बाद और उसके बाद छांटे जाने पर प्रत्येक पंक्ति का रिकॉर्ड नंबर रखता है।
गैरी Czychi

ठीक है, अच्छा, यह नहीं पता था। लेकिन यहाँ प्रश्न को टैग नहीं किया गया है, Filemakerइसलिए मुझे नहीं लगता कि उत्तर प्रासंगिक है। आप एक अस्थायी तालिका का उपयोग कर सकते हैं और उस कॉलम को ROW_NUMBER()फ़ंक्शन के साथ भर सकते हैं ।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.