ফ্লাইতে অন্য টেবিলের মানগুলির ভিত্তিতে একটি টেবিল কীভাবে আপডেট করবেন?


40

আইপসের নামে আমার নীচে যেমন একটি টেবিল রয়েছে:

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

আইপস টেবিলে প্রায় 100,000 রেকর্ড রয়েছে। নিম্নলিখিত দৃশ্যের জন্য কোনও জিজ্ঞাসা আছে: এটি সমান
কিনা ips.isoতা পরীক্ষা করুন country.iso, যদি এটি সমান হয় তবে that রেকর্ডে কান্ট্রি কোডআউট্রিড যুক্ত করুন। আমি এটি করার কোনও উপায় ভাবতে পারিনি। কীভাবে করবেন তা আপনার কোনও ধারণা আছে?

উত্তর:


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

মাইএসকিউএল আপডেট একাধিক টেবিল বাক্য গঠন ব্যবহার করে:

14.2.11 আপডেটের সিনট্যাক্স

নোট করুন যে আপনার আইসো কলামগুলিতে আপনার দুটি পৃথক দৈর্ঘ্য এবং ডেটা প্রকার রয়েছে। আসলে, আইএসও কোডের দুটি পৃথক সেট, ২-বর্ণ এবং 3-বর্ণ রয়েছে, যাতে আপনি বাস্তবে এই কলামগুলিতে যোগ দিতে নাও পারেন:

আইএসও 3166-1

USING (iso)পরিবর্তে যোগদানের শর্তটিও ON ips.iso = country.isoকাজ করে।


আপনি এমন এক প্রতিভা যার উত্তর আপনি আমার সময় বাঁচিয়েছেন
হামফ্রে

এটি আমাকে বিস্মিত করে যে এই ক্রিয়াটি সম্পাদন করার জন্য কতটা ছোট কোড প্রয়োজন!
ম্যাট ক্রিমেন্স

32

@ কেড রক্সের সমাধানটি আমাকে একটি সিনট্যাক্স ত্রুটি দেয়, মাইএসকিএল 5.5.29 এর জন্য সঠিক এটি:

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

"FROM" কীওয়ার্ড ছাড়াই।


1
এটি এর পরে ঠিক হয়ে গেছে, মনে হচ্ছে ...
রজারডপ্যাক

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 এ সেট করবে, আমার মিল না থাকলে আমার কোনও বিদ্যমান মান পরিবর্তন করবে না। এটি পছন্দসই বা নাও হতে পারে। এছাড়াও কার্যকরকরণ পরিকল্পনাটি অপ্টিমাইজারের উপর নির্ভর করে পৃথক হতে পারে।
কেড রক্স

@ কেডরক্স আমি নুল অংশ সম্পর্কে ভাবি নি, ধন্যবাদ।
ALH

1
@ john.locke এটি সম্ভবত কোনও সমস্যা নয় - আপনি যখন নতুন কলামটি যুক্ত করবেন তখন আমি ধরে নিচ্ছি এটি নুল হবে এবং একটি বিদেশী কীও, সুতরাং অবৈধ প্রবেশের অনুমতি দেওয়া হবে না। তবে আপনার প্রশ্নে স্পষ্টভাবে কী দেওয়া হয়েছে তা বলা শক্ত hard
কেড রক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.