2011-07-12 19 views
5
साथ क्वेरी REPLACE

तो MYSQL के REPLACE आदेश (समारोह की जगह तार के साथ भ्रमित होने की नहीं) एक पंक्ति की जगह अगर वहाँ डाला डेटा के साथ एक ही प्राथमिक कुंजी के साथ एक स्तंभ मौजूद ...mysql कई प्राथमिक कुंजी

लेकिन क्या होगा यदि मेरे पास दो प्राथमिक कुंजी हैं और मैं केवल उनमें से एक को प्रतिस्थापित करने के लिए पंक्ति निर्दिष्ट करने के लिए दोनों का उपयोग करना चाहता हूं .... मैं केवल

+1

परिभाषा के अनुसार एक तालिका में केवल एक ही पीके हो सकता है। क्या आपका मतलब अद्वितीय कुंजी है? – Jason

+0

मुझे पूरा यकीन है कि उसका मतलब बहु-स्तंभ प्राथमिक कुंजी था। –

+1

आपके पास दो प्राथमिक कुंजी नहीं हो सकती हैं। क्या आपका मतलब है कि आपके पास यौगिक प्राथमिक कुंजी है? – Flimzy

उत्तर

5

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

REPLACE INTO `my_table` (`key1`, `key2`, `othercolumn1` /* , ... */) 
    VALUES ('widgets', 14, 'Blue widget with purple trim'); 

संपादित

यहाँ अपने परीक्षण मैं अपने परीक्षण डेटाबेस में भाग गया यकीन है कि मैं के बारे में अपने डेटा को नष्ट करने के लिए नहीं था बनाने के लिए है। बेशक, अगर आप अनिश्चित हैं तो मैं इसे आज़माने के लिए प्रोत्साहित करता हूं!

CREATE SCHEMA `my_testdb`; 
USE `my_testdb`; 
CREATE TABLE `my_table` (
    `key1` VARCHAR(20) NOT NULL, 
    `key2` INTEGER NOT NULL, 
    `othercolumn1` VARCHAR(50), 
    CONSTRAINT PRIMARY KEY (`key1`, `key2`)); 
REPLACE INTO `my_table` (`key1`, `key2`, `othercolumn1`) 
    VALUES ('widgets', 14, 'Green widget with fuchsia trim'); 
REPLACE INTO `my_table` (`key1`, `key2`, `othercolumn1`) 
    VALUES ('widgets', 15, 'Yellow widget with orange trim'); 
REPLACE INTO `my_table` (`key1`, `key2`, `othercolumn1`) 
    VALUES ('thingamabobs', 14, 'Red widget with brown trim'); 
REPLACE INTO `my_table` (`key1`, `key2`, `othercolumn1`) 
    VALUES ('widgets', 14, 'Blue widget with purple trim'); 
SELECT * FROM `my_table`; 

यह मेरा परिणाम है:

key1   key2 othercolumn1 
widgets  14 Blue widget with purple trim 
widgets  15 Yellow widget with orange trim 
thingamabobs 14 Red widget with brown trim 

किसी अन्य संपादन का

मुझे लगता है कि मैं देख रहा हूँ कि तुम क्या दस्तावेज में के बारे में बात कर रहे हैं, अद्वितीय स्तंभों पर भ्रम की स्थिति:

तालिका एक पंक्ति में एक से अधिक पुरानी पंक्ति को प्रतिस्थापित करने के लिए एक पंक्ति के लिए संभव है कई अद्वितीय इंडेक्स में नई पुरानी पंक्तियों के लिए कई अनन्य अनुक्रमणिका और नई पंक्ति डुप्लिकेट मान देती है। - MySQL प्रलेखन

एक नहीं बल्कि काल्पनिक परिस्थिति जिसमें पंक्ति आप संघर्ष न सिर्फ एक मौजूदा प्राथमिक कुंजी के साथ है, लेकिन अन्य विशिष्ट कॉलम के साथ साथ बदल रहे हैं और साथ ही की बात कर रहा है यही कारण है कि। यहाँ इस बिंदु को वर्णन करने के लिए एक उदाहरण है:

CREATE SCHEMA `my_testdb2`; 
USE `my_testdb2`; 
CREATE TABLE `my_table` (
    `key1` VARCHAR(20) NOT NULL, 
    `key2` INTEGER NOT NULL, 
    `color` VARCHAR(20) NOT NULL UNIQUE, 
    `othercolumn1` VARCHAR(50), 
    CONSTRAINT PRIMARY KEY (`key1`, `key2`)); 
REPLACE INTO `my_table` (`key1`, `key2`, `color`, `othercolumn1`) 
    VALUES ('widgets', 14, 'green', 'Green widget with fuchsia trim'); 
REPLACE INTO `my_table` (`key1`, `key2`, `color`, `othercolumn1`) 
    VALUES ('widgets', 15, 'yellow', 'Yellow widget with orange trim'); 
REPLACE INTO `my_table` (`key1`, `key2`, `color`, `othercolumn1`) 
    VALUES ('thingamabobs', 14, 'red', 'Red widget with brown trim'); 
REPLACE INTO `my_table` (`key1`, `key2`, `color`, `othercolumn1`) 
    VALUES ('widgets', 14, 'yellow', 'Yellow widget with purple trim'); 
SELECT * FROM `my_table`; 

सूचना है कि पिछले (key1, key2) प्राथमिक कुंजी के साथ आपरेशन न केवल संघर्ष की जगह के पहले REPLACE, लेकिन यह भी एक दूसरे का अनूठा रंग के साथ। इस मामले में, पिछले पंक्तियों के संचालन के पहले दोनों पंक्तियां हटा दी जाती हैं ताकि परिणाम कोई संघर्ष न हो। तुम सिर्फ दो पंक्तियों से खत्म करेंगे:

key1   key2 color othercolumn1 
widgets  14 yellow Yellow widget with purple trim 
thingamabobs 14 red  Red widget with brown trim 

दोनों (key1, key2) ('widgets', 14) और रंग के साथ पंक्ति के बराबर के साथ पंक्ति 'पीला' दूर वजह से जलकर खाक हो गयीं तालिका पर कई अद्वितीय बाधाओं के साथ विवादित नई पंक्ति के लिए।

आशा है कि इससे मदद मिलती है!

+2

यह सच है ... जिस तरह से मैं समझता हूं कि प्रतिस्थापन प्रतिस्थापित होगा यदि एकाधिक कुंजियों में से कोई भी डुप्लीकेट है .... जिस तरह से मैं चाहता हूं कि यह है कि दोनों चाबियाँ डुप्लिकेट हैं, न केवल उनमें से एक। .. अगर मैं गलत हूं तो मुझे सही करें – pillarOfLight

+1

हां, यह सच है।मैंने इसे एक टेस्ट डेटाबेस पर चलाया है जिसे मैंने यह सुनिश्चित करने के लिए बनाया है कि मैं गलत प्रदर्शन नहीं कर रहा हूं, और यह केवल उन मानों को प्रतिस्थापित करता है जहां दोनों कॉलम मेल खाते हैं, न तो/या। संदेह में, इसे एक भंवर दे दो! –

+0

@ user841626: इस तरह मैंने दस्तावेज़ को भी पढ़ा है। यद्यपि यह व्यवहार करने के लिए आपको इसका परीक्षण करना पड़ सकता है, हालांकि यह कैसे व्यवहार करता है। – Flimzy

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