2013-02-12 7 views
5

क्या MySQL डेटाबेस में टेबल पर एक अद्वितीय अनुक्रमणिका बनाने का कोई तरीका है?क्या एकाधिक तालिकाओं में एक अद्वितीय (इंडेक्स) बाधा उत्पन्न करना संभव है?

अद्वितीय रूप से, मेरा मतलब है,

   table A ids=1,2,5,7... 

       table B ids=3,4,6,8... 
+0

दुर्भाग्यवश यह बाधा (एक "वितरित कुंजी") मानक एसक्यूएल रिलेशनल बाधा के रूप में मॉडल करना असंभव है। इसे कई तरीकों से अनुकरण किया जा सकता है, लेकिन मेरे पास आम तौर पर "icky" के विभिन्न दृष्टिकोण होते हैं - हालांकि मैं कभी-कभी कोशिश करता रहता हूं! - और इन दिनों इस तरह की स्थिति से बचने के लिए मेरी पूरी कोशिश करें। मैं सुझाव देता हूं कि मॉडल को अधिक "एसक्यूएल फ्रेंडली" तरीके से प्रस्तुत करने का प्रयास करें, यदि संभव हो तो। –

उत्तर

8

मुझे लगता है कि, यह सीधे एक बाधा पैदा करके संभव नहीं है। लेकिन अद्वितीय आईडी प्राप्त करने के लिए कुछ समाधान हैं।

TRIGGER का उपयोग करके एक सुझाव होगा। INSERT से पहले दोनों टेबलों पर ट्रिगर करें जो INSERT या UPDATE के दौरान अस्तित्व के लिए आईडी की जांच करता है।

दूसरा, एक तीसरी तालिका बनाकर है जिसमें UNIQUE संख्याएं और अन्य तालिकाएं हैं: TableA और TableB तब तीसरे पर संदर्भित होंगे।

1

जेडब्ल्यू की तरह, यह शायद तीसरी तालिका का उपयोग करने के साथ अच्छी तरह से काम करेगा। MySQL में, आप इसे आसान बनाने के लिए पहचान फ़ील्ड का उपयोग कर सकते हैं। एक बहुत ही सरल उदाहरण (किसी भी आगे की जानकारी जानने के बिना सिर्फ नाम के साथ टेबल के सरल संस्करण) इन तालिकाओं का उपयोग होगा:

CREATE TABLE a 
    (
    `id` int, 
    `name` varchar(100), 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 
CREATE TABLE b 
    (
    `id` int, 
    `name` varchar(100), 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 
CREATE TABLE c 
    (
    `id` int auto_increment, 
    `intable` varchar(10) not null, 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 

फिर, जब आप या तो मेज पर एक मान सम्मिलित (एक नमूना डालने करना चाहते हैं एक में 'जो'):

INSERT INTO c (`intable`) VALUES ('a'); 
INSERT INTO a (`id`, `name`) 
    SELECT LAST_INSERT_ID() AS id, 'Joe' AS name; 

ग में intable प्रवेश के लिए एकमात्र कारण आप जानते हैं जो तालिका इसके लिए बनाया गया था तो है। सी में डालने के लिए किसी भी प्रकार का मूल्य इसके बजाय इस्तेमाल किया जा सकता है।

+0

'LAST_INSERT_ID' अत्यधिक समवर्ती सिस्टम में अप्रत्याशित व्यवहार उत्पन्न कर सकता है। – singe3

+1

LAST_INSERT_ID में अत्यधिक समवर्ती सिस्टम पर कोई समस्या नहीं है। Http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id पर दस्तावेज़ देखें जो बताता है "जेनरेट की गई आईडी को सर्वर पर प्रति- कनेक्शन के आधार पर। इसका मतलब है कि किसी दिए गए क्लाइंट को फ़ंक्शन द्वारा लौटाए गए मान को पहले क्लाइंट द्वारा AUTO_INCREMENT कॉलम को प्रभावित करने वाले सबसे हालिया कथन के लिए जेनरेट किया गया पहला AUTO_INCREMENT मान है। यह मान अन्य क्लाइंटों से प्रभावित नहीं हो सकता है, भले ही वे AUTO_INCREMENT मान उत्पन्न करते हैं उनका अपना।" क्या आप एसक्यूएल सर्वर के बारे में सोच रहे हैं? –

+0

नहीं, आप सही हैं, मैं इस तथ्य के बारे में सोच रहा था कि कुछ लोग एक और मूल्य डालने के लिए LAST_INSERT_ID() + 1 का उपयोग करते हैं, जो आईडी + 1 पहले ही लिया जा सकता है, जो असफल हो सकता है। – singe3

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