2008-10-03 12 views
8

हाय के बीच स्वत: वृद्धि वाली प्राथमिक कुंजी साझा करें हाय मैं दो टेबलों को एक आईएनटी "आईडी" कॉलम रखना चाहता हूं जो ऑटो-वृद्धि होगी लेकिन मैं नहीं चाहता कि "आईडी" कॉलम कभी भी वही नंबर साझा करें। इसे क्या कहा जाता है और इसे करने का सबसे अच्छा तरीका क्या है? अनुक्रम? Iterator? सूचकांक? Incrementor?दो टेबल

प्रेरणा: हम एक स्कीमा से दूसरे में माइग्रेट कर रहे हैं और एक वेब पेज है जो दोनों टेबल पढ़ता है और (int) आईडी दिखाता है, लेकिन मेरे पास दोनों टेबलों के लिए एक ही आईडी का उपयोग नहीं किया जा सकता है।

मैं SQL सर्वर 9.0.3068 का उपयोग कर रहा हूं।

धन्यवाद!

+0

क्या आप जोड़ सकते हैं कि कृपया क्यों आवश्यकता होगी? एक बेहतर डिजाइन हो सकता है जिसके लिए GUID के उपयोग की आवश्यकता नहीं होगी। –

उत्तर

14

बस पहचान वृद्धि को> 1 के रूप में कॉन्फ़िगर करें। तालिका एक पहचान (1, 10) [1,11,21 ...] और तालिका दो उपयोग पहचान (2, 10) [2,12,22 ...] का उपयोग करता है। यदि आवश्यक हो तो यह आपको विस्तार के लिए कुछ जगह भी देगा।

+0

मैं यह कैसे करूँ? क्या PHPMyadmin का उपयोग करके ऐसा करने के लिए वैसे भी है? – everconfusedGuy

+0

ऐसा करने पर भी एक बड़ा उपयोग करने पर विचार करें। –

3

मुझे लगता है कि GUID का उपयोग करना सबसे सरल तरीका होगा, अगर मैं आपको सही ढंग से समझता हूं।

SELECT NEWID() 
+0

क्षमा करें, मुझे यह उल्लेख करना चाहिए था कि इसे एक int होना चाहिए। – user24881

2

GUID (वैश्विक रूप से अद्वितीय पहचानकर्ता) प्रकार के साथ एक कॉलम का उपयोग करें। यह 16 बाइट है और प्रत्येक पंक्ति के लिए हमेशा अद्वितीय होगा।

बस जागरूक रहें कि आपको सामान्य पूर्णांक कुंजी की तुलना में एक महत्वपूर्ण प्रदर्शन हिट मिलेगी।

1

टाइप आईडी के आईडी आईडी के साथ एक और तालिका का उपयोग करें, जिसे 1 या डिफ़ॉल्ट कहा जाता है।

एक संग्रहित प्रक्रिया मान को पुनर्प्राप्त करें, 1 जोड़ें, फिर कुंजीआईडी ​​अपडेट करें, फिर इसे संग्रहीत प्रक्रिया में वापस करें जो आपकी दो तालिकाओं को अपडेट कर रहा है, जिसके लिए नई अनूठी कुंजी की आवश्यकता है।

यह सुनिश्चित करेगा कि आईडी एक int है, और यह तालिकाओं के सेट के बीच अद्वितीय है जो नई आईडी उत्पन्न करने के लिए संग्रहीत प्रक्रिया का उपयोग कर रहे हैं।

0

मुझे नहीं पता कि आप इसे क्या कहेंगे।

यदि आप GUID या एक अलग तालिका का उपयोग नहीं करना चाहते हैं, तो आप एक फ़ंक्शन भी बना सकते हैं जो दोनों तालिकाओं से आईडी के अधिकतम मानों को देखता है और उस मान को एक जोड़ा जाता है (या ऐसा कुछ) ।

फिर आप उस फ़ंक्शन को दोनों तालिकाओं पर एक सम्मिलित ट्रिगर में कॉल कर सकते हैं।

0

मैं व्यक्तिगत रूप से GUID समाधान का प्रशंसक हूं, लेकिन यहां एक व्यवहार्य विकल्प है।

इस समस्या के कई समाधानों ने GUID से बचा है और अच्छे पुराने पूर्णांक का उपयोग किया है। यह मर्ज प्रतिकृति परिस्थितियों के साथ भी आम है जहां कई उपग्रह साइटें मास्टर और कुंजी विवादों के साथ विलय करने की आवश्यकता होती है।

यदि GUID आपके लिए काम नहीं करेगा, और आपके पास बिल्कुल int, bigint, या जैसा होना चाहिए, तो आप हमेशा एक पहचान कॉलम का उपयोग कर सकते हैं और प्रत्येक तालिका को SEED के लिए एक अलग मान के साथ कर सकते हैं। उन डेटाटाइपों की एक विस्तृत श्रृंखला होती है, और रेंज को उपयोग करने योग्य सेगमेंट में विभाजित करना बहुत कठिन नहीं होता है, खासकर यदि आप चाहते हैं कि दो स्प्लिट हों। उदाहरण के तौर पर, मूल int में 2^31 (-2,147,483,648) से 2^31 - 1 (2,147,483,647) के माध्यम से एक सीमा होती है। उदाहरण के लिए, ग्राहक तालिका के लिए यह पर्याप्त है।

Transact-SQL संदर्भ (एसक्यूएल सर्वर 2000) int, bigint, smallint, and tinyint

उदाहरण:

--Create table with a seed of 1 billion and an increment of 1 
CREATE TABLE myTable 
(
primaryKey int IDENTITY (1000000000, 1), 
columnOne varchar(10) NOT NULL 
) 
1

आप किसी तृतीय तालिका में एक पहचान स्तंभ को परिभाषित, का उपयोग करें कि ID मान उत्पन्न करने के लिए कर सकते हैं, लेकिन आप तालिका में किए गए किसी भी आवेषण को हमेशा रोल करें (इसे बढ़ने से बचने के लिए)। लेनदेन को वापस लेना इस तथ्य को वापस नहीं लाता है कि आईडी उत्पन्न हुई थी।

मैं माइक्रोसॉफ्ट एसक्यूएल सर्वर का नियमित उपयोगकर्ता नहीं हूं, इसलिए कृपया किसी वाक्यविन्यास gaffes को क्षमा करें। लेकिन निम्नलिखित की तरह कुछ मेरे मन में है:

CREATE TABLE AlwaysRollback (
    id IDENTITY(1,1) 
); 

BEGIN TRANSACTION; 
INSERT INTO AllwaysRollBack() VALUES(); 
ROLLBACK TRANSACTION; 

INSERT INTO RealTable1 (id, ...) VALUES (SCOPE_IDENTITY(), ...); 

BEGIN TRANSACTION; 
INSERT INTO AllwaysRollBack() VALUES(); 
ROLLBACK TRANSACTION; 

INSERT INTO RealTable2 (id, ...) VALUES (SCOPE_IDENTITY(), ...); 
0

तुम सच में एक पूर्णांक के साथ ऐसा करने की जरूरत है और आप एक ऑटो incrementing संख्या, जिस तरह से मैं इस से पहले किया है आईडी क्षेत्र बदलने के लिए है, तो अन्य तालिका के अनुक्रम में ऑटो वृद्धि कार्य। मैं एमएस एसक्यूएल या मेरे एसक्यूएल में लेकिन pgsql में भी यकीन है कि इसका मतलब है कि एसक्यूएल में आप इस क्षेत्र

id integer NOT NULL DEFAULT nextval('table_two_seq'::regclass), 

जहां table_two_sequence अन्य तालिका के लिए अनुक्रम समारोह है होता नहीं हूँ। फिर कुछ डेटा डालने से इसका परीक्षण करें। मैं वास्तव में माफी चाहता हूं अगर यह एमएस एसक्यूएल में काम नहीं करेगा तो मैं इसे स्पष्ट करने की कोशिश करता हूं। यह जानकर कि GUID सबसे अच्छा तरीका है जैसा कि दूसरों द्वारा उल्लेख किया गया है। या आपके द्वारा उपयोग किए जाने वाले कोड में डालने पर आप उसमें एक एल्गोरिदम डाल सकते हैं लेकिन यह गन्दा हो सकता है।

वैकल्पिक रूप से, एक तालिका में डेटा रखने के बारे में सोचें क्योंकि यह इसके आसपास एक तरीका होगा। यदि आपको आवश्यकता है तो आप दो तालिकाओं को अनुकरण कर सकते हैं। सिर्फ एक विचार।

आशा है कि मैं

0

मदद की है SQL सर्वर 2012 के साथ शुरू आप एक दृश्य वस्तु https://msdn.microsoft.com/en-us/library/ff878091.aspx जो आप वास्तव में क्या जरूरत घोषणा कर सकते हैं।

मुझे एक अनुक्रम ऑब्जेक्ट को अनुक्रमित करने के लिए बहुत छोटा होना चाहिए जिसमें अगला अनुक्रम मान और एक संग्रहीत प्रक्रिया परमाणु रूप से मान और वृद्धि का चयन करें। [आपको फ़ंक्शन का उपयोग करना अच्छा लगेगा, लेकिन फ़ंक्शन का दुष्प्रभाव नहीं हो सकता है।]

इस हैक के बारे में कैसे? दो स्तंभों के साथ एक तालिका (MySequence) बनाएं: और पहचान कॉलम (अनुक्रम वैल्यू) और एक डमी कॉलम (डमीवेल्यू) और एक नया अनुक्रम मान प्राप्त करने के लिए इस संग्रहीत प्रक्रिया का उपयोग करें। तालिका में एकमात्र पंक्ति अंतिम अनुक्रम मान पुनर्प्राप्त होगी।

CREATE PROCEDURE GetNextValue 
AS 
BEGIN 
    DECLARE @value int = null; 

    -- Insert statements for procedure here 
    INSERT into MySequence (DummyValue) Values (null); 

    SET @value = SCOPE_IDENTITY(); 

    DELETE from MySequence where SequenceValue <> @value 

    SELECT @value as Sequence 

    return @value 
END 

अनुक्रम का उपयोग करने के लिए आपको लक्ष्य तालिकाओं में आवेषण प्रबंधित करना होगा - एक ट्रिगर शायद काम करेगा।

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