2010-11-07 16 views
65

मैं केवल एक स्तंभ, adminId जो प्राथमिक कुंजी है के साथ एक मेज प्रशासक की है। व्यापार नियमों के कारण इसे इस तरह से होना चाहिए।एक पहचान स्तंभ के साथ एक मेज में सम्मिलित करना पंक्तियों केवल

मैं एक बार और सभी मैं संग्रहित प्रक्रियाओं है कि इस तरह तालिकाओं में मान डालने कैसे लिख सकते हैं के लिए समझने के लिए चाहते हैं। मैं एसक्यूएल सर्वर और T-SQL का उपयोग कर रहा है और() SCOPE_IDENTITY का उपयोग कर की कोशिश की लेकिन जब से तालिका में झूठी या बंद करने के लिए INSERT_IDENTITY है कि काम नहीं करता।

मैं वास्तव में एक डमी मान प्रविष्ट नहीं करना चाहते हैं तो बस एक नई पंक्ति सम्मिलित करने में सक्षम हो। धन्यवाद!

+1

स्पष्टीकरण के लिए: आपका प्रश्न "एक आईडी सर्वर कॉलम में पंक्तियों को एक एकल पहचान कॉलम के साथ कैसे डालें" है? – gbn

+0

हां, आप सही हैं, – Phil

+1

स्पष्टीकरण के लिए धन्यवाद यहां लैंडिंग लोगों के लिए, यह पहले पूछा गया है और सही उत्तर यहां है: http: // stackoverflow।कॉम/प्रश्न/850327/कैसे-टू-डालने-इन-ए-टेबल-बस-एक-पहचान-कॉलम – BJury

उत्तर

111

आप एक स्तंभ एक पहचान यह है कि, है, तो सिर्फ इस

करना
INSERT MyTable DEFAULT VALUES; --allows no column list. The default will be the IDENTITY 
SELECT SCOPE_IDENTITY(); 

आप पहचान की जरूरत नहीं है, तो आप यह निर्धारित कर सकते हैं? यह सबसे अच्छा तरीका है .. और उपरोक्त एसक्यूएल का उपयोग करें। उच्च लोड के तहत

  • मैक्स समाधान डुप्लिकेट
  • SCOPE_IDENTITY इस तथ्य के बाद है के साथ विफल हो सकता है,:

    यदि नहीं, तो आप एक नई पंक्ति

    INSERT MyTable (admidid) 
    OUTPUT INSERTED.admidid --returns result to caller 
    SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable 
    

    नोट्स सम्मिलित करना चाहते हैं पहले

  • SCOPE_IDENTITY केवल एक पहचान स्तंभ के साथ काम करता नहीं। डिट्टो IDENT_CURRENT
  • उपयोग कर किसी भी मूर्खता उत्पादन खंड मैक्स समाधान
+0

धन्यवाद, लेकिन "डुप्लिकेट" के साथ आपका क्या मतलब है? – Phil

+3

आपका पहला प्रस्ताव ठीक काम करता था। धन्यवाद! – Phil

+0

@ फिल: आपका स्वागत है। "डुप्लिकेट्स" एक टाइपो था :) – gbn

0

आप अपने चुनिंदा बयान के identity_insert जोड़ने की जरूरत:

SET IDENTITY_INSERT MyTable ON 

INSERT INTO MyTable 
(AdminCol) 

SELECT AdminColValue 

FROM Tableb 

जब आप कर रहे हैं, आप

SET IDENTITY_INSERT MyTable OFF 

के लिए याद यह इस प्रकार से बोल से काम करता है का अच्छा वर्णन है सुनिश्चित करें : http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

+0

क्या मुझे ऐसा करना चाहिए: SET IDENTITY_INSERT व्यवस्थापक को व्यवस्थापक में शामिल करें (SCOPE_IDENTITY()) SET IDENTITY_INSERT व्यवस्थापक बंद ? – Phil

+0

हां। आपको बस इतना करना है। सेट करें, अपना कोड लिखें, अंत में सेट बंद करें। – DataWriter

+0

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

0

@Phil के लिए SCOPE_IDENTITY बदल देता है: आप अपनी तालिका दो (2) कॉलम, autoincrementing पी स्तंभ और एक AdminName स्तंभ है इसका मतलब यह नहीं है? यदि इसमें केवल एक कॉलम है जहां AdminName जाता है, तो AdminName पीके है और आप निश्चित रूप से एक स्ट्रिंग को स्वत: संयोजित नहीं कर सकते हैं। क्या व्यवसाय नियम आपको पूरी तरह से योग्य विंडोज उपयोगकर्ता नाम प्राथमिक कुंजी बनाने की उम्मीद करते हैं? यह व्यवहार्य होगा और समझ में आएगा, क्योंकि तब आपको AdminName कॉलम पर वैकल्पिक अद्वितीय अनुक्रमणिका की आवश्यकता नहीं होगी।

लेकिन अगर आपके तालिका में दो कॉलम, एक नहीं है: SQLServer में

autoincrement तालिका/स्तंभ परिभाषा का हिस्सा है। आप कॉलम को एक पूर्णांक के रूप में परिभाषित करते हैं और फिर इसे पहचान कॉलम भी बनाते हैं, जो वृद्धि को निर्दिष्ट करते हैं, आमतौर पर 1, लेकिन यह 2 या 5 या 10 या जो भी हो सकता है। एक पंक्ति सम्मिलित करने के लिए, तो आप बस अन्य स्तंभ सम्मिलित (रों) मूल्य (रों) और पी के स्तंभ के साथ कुछ भी नहीं:

insert into T 
(foo) -- column(s) list 
values('bar') -- values list 

आपका संग्रहीत proc करता है कि डालने SCOPE_IDENTITY एक वापसी मान कर सकते हैं या SCOPE_IDENTITY हो सकता है क्लाइंट को आउट आउट पैरामीटर के रूप में वापस भेज दिया गया।

पीएसSCOPE_IDENTITY() वर्तमान दायरे में सबसे हाल ही में जेनरेट की गई पहचान की गई पहचान मान देता है; यह अगली पहचान मान उत्पन्न नहीं करता है।

संपादित करें:

मुमकिन है, अपने व्यवस्थापकों तालिका प्रशासकों के एक सेट होता है। लेकिन अगर इसमें पूर्णांक प्राथमिक कुंजी कॉलम के अलावा कोई भी कॉलम नहीं है, तो प्रशासकों की पहचान करने का कोई तरीका नहीं है; केवल एक चीज जो आप कर सकते हैं उन्हें एक-दूसरे से अलग करना है। यह आपको बहुत दूर नहीं लेता है। लेकिन आपके व्यवस्थापक तालिका में निम्नलिखित किसी एक संरचना था:

ID INTEGER PRIMARY KEY AUTOINCREMENT 
windowsusername varchar(50) (unique index) 

या

windowsusername varchar(50) primary key 

आप अन्य तालिकाओं से व्यवस्थापक की तालिका को देख करने में सक्षम होगा, और विदेशी कुंजी सार्थक होगा। और यह वही है जो एक एकल पूर्णांक स्तंभ वाली एक तालिका का अर्थ है - अर्थात्।

दो स्तंभों के बाद, आप तो एक संग्रहीत प्रक्रिया हो सकता था ऐसा करते हैं:

insert into Administrators 
(windowsusername) 
values('mydomain\someusername'); 
return SCOPE_IDENTITY(); 

और आपके ग्राहक-कार्यक्रम वापस एक वापसी मान autoincremented आईडी कि ऑटोजनरेटेड किया गया था और करने के लिए नव डाला सौंपा के रूप में मिलेगा पंक्ति। यह दृष्टिकोण सामान्य अभ्यास है, और मैं कहूंगा कि इसे "सर्वोत्तम अभ्यास" माना जाता है।

पीएस आप उल्लेख करते हैं कि अगर आपको "सम्मिलित करने के लिए कुछ भी नहीं था" तो आपको "मूल्य डालने" के बारे में नहीं पता था। वहाँ एक विरोधाभास है। यदि आपके पास डालने के लिए कुछ भी नहीं है, तो क्यों डालें? यदि आप ग्राहक के बारे में बिल्कुल कुछ नहीं जानते हैं तो आप एक नया ग्राहक रिकॉर्ड क्यों बनायेंगे? उनका नाम नहीं, उनका शहर, उनका फोन नंबर, कुछ भी नहीं?

+2

मेरी तालिका में एक कॉलम है, adminId, जो एक वृद्धिशील int मान – Phil

+0

है जो मैंने कभी देखा है कि अजीब डिजाइन है, और मैं 20 से अधिक वर्षों से व्यवसाय में रहा हूं और मेरे कुछ अजीब चीजें देखी हैं दिन। तो आपका सवाल यह है कि, आप उस तालिका में कैसे सम्मिलित करते हैं जिसमें केवल एक प्राथमिक कुंजी कॉलम होता है जिसे एक ऑटोइनक्रिकमेंटिंग पहचान कॉलम के रूप में परिभाषित किया जाता है, जब तालिका में पीके कॉलम होता है और केवल वह पीके कॉलम होता है, कोई अन्य कॉलम नहीं .. – Tim

+0

तो डाउनवॉट क्या है ? डिजाइन की योग्यता की कमी के बारे में कहीं भी एक वास्तविक त्रुटि या एक राय व्यक्त करने के लिए? – Tim

-2

जब भी हम "ऑन" कॉलम की पहचान संपत्ति सेट करते हैं, तो हमें उस कॉलम में स्पष्ट रूप से मूल्य डालने की आवश्यकता नहीं होती है। SQL सर्वर अंतर्निहित मूल्य के आधार पर पहचान कॉलम में मूल्यों को सम्मिलित करता है। यहां हम देखेंगे कि हम पहचान कॉलम में मूल्यों को स्पष्ट रूप से कैसे सम्मिलित कर सकते हैं। सबसे पहले हम पहचान कॉलम के साथ एक टेबल तैयार करेंगे।

नीचे पहचान स्तंभ के साथ तालिका बनाने के लिए स्क्रिप्ट है: -

create table Identitytable(id int identity,Name varchar(50)) 

तालिका "Identitytable" एक पहचान स्तंभ के रूप में "आईडी" कॉलम, मैं परिभाषित किया है में। आइए "आईडी" कॉलम में स्पष्ट रूप से मूल्य डाले बिना इस तालिका में कुछ पंक्तियां डालें।

insert into Identitytable(Name) values('Neeraj') 
insert into Identitytable(Name) values('Raj') 
insert into Identitytable(Name) values('Akshay') 
insert into Identitytable(Name) values('Ankit') 
insert into Identitytable(Name) values('Vikas') 

हम स्क्रिप्ट ऊपर चलाने तालिका "Identitytable" में 5 पंक्तियाँ सम्मिलित करें और के की जाँच क्या तालिका में डाला जाता है यह बताने के लिए होगा।

उपर्युक्त छवि में हम आईडी कॉलम (1,2,3,4,5) के मान देख सकते हैं, जबकि हमने स्पष्ट रूप से "आईडी" कॉलम में मान डाले नहीं थे। अब आइए स्पष्ट रूप से "आईडी" कॉलम में मान डालने का प्रयास करें।

नीचे दी गई लिपि में, हम मूल्य "9" को "आईडी" कॉलम में स्पष्ट रूप से डालने का प्रयास कर रहे हैं, देखते हैं कि नीचे दी गई क्वेरी का परिणाम क्या है।

insert into Identitytable(Id,Name) values(9,'Mamta') 
+2

आपके ब्लॉग से एक और कॉपी + पेस्ट आलेख। कृपया यह मत करो! अगर हम _genuinely_ प्रासंगिक हैं, तो कृपया कुछ उपयोगी स्व-ब्लॉग पोस्टिंग पर ध्यान न दें, लेकिन कृपया प्रत्येक उत्तर के साथ नहीं। – halfer

संबंधित मुद्दे