मक्खी पर अन्य तालिका के मूल्यों के आधार पर एक तालिका कैसे अपडेट करें?


40

मेरे पास नीचे के रूप में ips के नाम पर एक तालिका है:

CREATE TABLE `ips` (
 `id` int(10) unsigned NOT NULL DEFAULT '0',
 `begin_ip_num` int(11) unsigned DEFAULT NULL,
 `end_ip_num` int(11) unsigned DEFAULT NULL,
 `iso` varchar(3) DEFAULT NULL,
 `country` varchar(150) DEFAULT NULL
) ENGINE=InnoDB

मान लें कि मेरे पास countryidदेश तालिका से इस तालिका पर एक फ़ील्ड है जो नीचे है:

CREATE TABLE `country` (
 `countryid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `ordering` smallint(5) unsigned NOT NULL DEFAULT '0',
 `iso` char(2) NOT NULL,
 PRIMARY KEY (`countryid`)
) ENGINE=InnoDB

Ips टेबल में लगभग 100,000 रिकॉर्ड हैं। क्या निम्नलिखित परिदृश्य के लिए कोई प्रश्न है:
यदि ips.isoबराबर है country.iso, तो जांचें कि क्या यह बराबर है , तो उस रिकॉर्ड में कंट्री.काउट्रीड जोड़ें। मैं ऐसा करने का कोई तरीका नहीं सोच सकता था। क्या आपके पास कोई विचार है कि कैसे करें?

जवाबों:


72
UPDATE ips INNER JOIN country
    ON ips.iso = country.iso
SET ips.countryid = country.countryid

MySQL अपडेट का उपयोग करते हुए कई टेबल सिंटैक्स:

14.2.11 अद्यतन सिंटैक्स

ध्यान दें कि आपके आइसो कॉलम पर दो अलग-अलग लंबाई और डेटा प्रकार हैं। वास्तव में, आईएसओ कोड के दो अलग-अलग सेट, 2-अक्षर और 3-अक्षर हैं, इसलिए आप वास्तव में इन कॉलम में शामिल नहीं हो सकते हैं:

आईएसओ 3166-1

कार्यों के USING (iso)बजाय जुड़ने की स्थिति ON ips.iso = country.iso


आप एक जीनियस हैं जिसका जवाब आपने मेरा समय बचा लिया है
हम्फ्री

यह मुझे हैरान करता है कि इस क्रिया को करने के लिए कितना कम कोड आवश्यक है!
मैट क्रेमेंस

32

@ कैड रॉक्स का समाधान मुझे एक वाक्यविन्यास त्रुटि देता है, mysql 5.5.29 के लिए सही है:

UPDATE ips 
INNER JOIN country
    ON ips.iso = country.iso
SET ips.countryid = country.countryid

"FROM" कीवर्ड के बिना।


1
यह तब से तय किया गया है, लगता है ...
rogerdpack

10

यह वाक्यविन्यास बेहतर पठनीय हो सकता है

UPDATE country p, ips pp
SET pp.countryid = p.countryid
WHERE pp.iso = p.iso

4

धन्यवाद @ काडे, लेकिन मुझे इसके लिए एक सरल समाधान मिला:

update ips set countryid=(select countryid from country where ips.iso=country.iso )

5
मेरे संस्करण के साथ व्यवहार में अंतर है - आपका संस्करण इसे NULL पर सेट करेगा यदि यह नहीं मिला है, तो मेरा मौजूदा मिलान नहीं होने पर मौजूदा मूल्य में परिवर्तन नहीं करेगा। यह वांछनीय हो सकता है या नहीं भी हो सकता है। इसके अलावा, निष्पादन योजना ऑप्टिमाइज़र के आधार पर भिन्न हो सकती है।
केड रूक्स

@CadeRoux मैंने NULL के बारे में नहीं सोचा, धन्यवाद।
ALH

1
@ john.locke यह शायद कोई समस्या नहीं है - जब आप नया कॉलम जोड़ते हैं, तो मुझे लगता है कि यह NULL होगा और एक विदेशी कुंजी भी होगी, इसलिए अमान्य प्रविष्टियों को वैसे भी अनुमति नहीं दी जाएगी। लेकिन आपके प्रश्न में स्पष्ट रूप से क्या दिया गया है, यह बताना कठिन है।
केड रूक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.