다른 테이블의 값을 기준으로 한 테이블을 즉시 업데이트하는 방법은 무엇입니까?


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.isocountry.coutryid를 해당 레코드에 추가하십시오. 나는 그것을 할 수있는 방법을 생각할 수 없었습니다. 그 방법을 알고 있습니까?

답변:


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

MySQL 업데이트 다중 테이블 구문 사용 :

14.2.11 업데이트 구문

아이소 컬럼에는 길이와 데이터 유형이 서로 다릅니다. 실제로 2 자리와 3 자리의 두 가지 ISO 코드 세트가 있으므로 실제로는이 열에 참여하지 못할 수 있습니다.

ISO 3166-1

USING (iso)대신 조인 조건 ON ips.iso = country.iso도 작동합니다.


당신은 당신이 대답 한 천재입니다. 내 시간을 구했습니다
humphrey

이 작업을 수행하는 데 필요한 코드가 얼마나되는지 놀랍습니다!
Matt Cremeens

32

@Cade Roux의 솔루션은 구문 오류를 제공합니다 .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

@Cade에게 감사하지만 간단한 해결책을 찾았습니다.

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

5
내 버전과 동작에 차이가 있습니다. 버전이 없으면 NULL로 설정하고 일치하지 않으면 기존 값을 변경하지 않습니다. 이것은 바람직하거나 바람직하지 않을 수 있습니다. 또한 실행 계획은 옵티 마이저에 따라 다를 수 있습니다.
케이드 룰

@CadeRoux NULL 부분에 대해서는 생각하지 않았습니다. 감사합니다.
ALH

1
@ john.locke 아마도 문제가되지 않을 것입니다-새 열을 추가 할 때 NULL 및 외래 키가 될 것이라고 가정하므로 유효하지 않은 항목은 허용되지 않습니다. 그러나 귀하의 질문에 명시 적으로 제공된 것을 말하기는 어렵습니다.
케이드 룰
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.