아래와 같이 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
country.coutryid를 해당 레코드에 추가하십시오. 나는 그것을 할 수있는 방법을 생각할 수 없었습니다. 그 방법을 알고 있습니까?
답변
UPDATE ips INNER JOIN country
ON ips.iso = country.iso
SET ips.countryid = country.countryid
MySQL 업데이트 다중 테이블 구문 사용 :
아이소 컬럼에는 길이와 데이터 유형이 서로 다릅니다. 실제로 2 자리와 3 자리의 두 가지 ISO 코드 세트가 있으므로 실제로는이 열에 참여하지 못할 수 있습니다.
USING (iso)
대신 조인 조건 ON ips.iso = country.iso
도 작동합니다.
답변
@Cade Roux의 솔루션은 구문 오류를 제공합니다 .mysql 5.5.29의 올바른 오류는 다음과 같습니다.
UPDATE ips
INNER JOIN country
ON ips.iso = country.iso
SET ips.countryid = country.countryid
“FROM”키워드없이
답변
이 구문은 더 잘 읽을 수 있습니다
UPDATE country p, ips pp
SET pp.countryid = p.countryid
WHERE pp.iso = p.iso
답변
@Cade에게 감사하지만 간단한 해결책을 찾았습니다.
update ips set countryid=(select countryid from country where ips.iso=country.iso )