web-dev-qa-db-ja.com

別のテーブルの値に基づいてその場で1つのテーブルを更新する方法は?

以下のように、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

以下のように、countryテーブルのこのテーブルに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.isocountry.isoと等しいかどうかを確認し、等しい場合は、country.coutryidをそのレコードに追加します。どうしようも考えられなかった。それを行う方法について何か考えがありますか?

43
ALH
_UPDATE ips INNER JOIN country
    ON ips.iso = country.iso
SET ips.countryid = country.countryid
_

MySQL更新を使用して、複数のテーブル構文:

14.2.11 UPDATE構文

Iso列には2つの異なる長さとデータ型があることに注意してください。実際には、2文字と3文字の2種類のISOコードセットがあるため、実際にはこれらの列を結合できない場合があります。

ISO 3166-1

結合条件__ON ips.iso = country.iso_ではなくUSING (iso)も機能します。

76
Cade Roux

@Cade Rouxのソリューションで構文エラーが発生します。mysql5.5.29の正しいエラーは次のとおりです。

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

「FROM」キーワードなし。

33
linuxatico

この構文は読みやすいかもしれません

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

@Cadeに感謝しますが、簡単な解決策を見つけました。

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