web-dev-qa-db-fra.com

Comment mettre à jour une table en fonction des valeurs d'une autre table à la volée?

J'ai un tableau au nom d'ips comme ci-dessous:

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

Supposons que j'ai un champ countryid sur cette table de la table country qui est comme ci-dessous:

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

Il y a environ 100 000 enregistrements dans la table ips. Y a-t-il une requête pour le scénario suivant:
Vérifier si ips.iso est égal à country.iso, s'il est égal, ajoutez country.coutryid à cet enregistrement. Je ne pouvais pas penser à un moyen de le faire. Avez-vous une idée de comment faire cela?

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

À l'aide de la syntaxe de mise à jour multiple de MySQL

Syntaxe de mise à jour 14.2.11

Notez que vous avez deux longueurs et types de données différents sur vos colonnes iso. Il existe, en fait, deux ensembles distincts de codes ISO, à 2 lettres et à 3 lettres, de sorte que vous ne pourrez peut-être pas en réalité joindre ces colonnes:

ISO 3166-1

La condition de jointure USING (iso) au lieu de ON ips.iso = country.iso Fonctionne également.

76
Cade Roux

La solution de @Cade Roux me donne une erreur de syntaxe, la bonne pour mysql 5.5.29 est:

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

sans le mot clé "FROM".

33
linuxatico

Cette syntaxe pourrait être mieux lisible

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

merci @Cade, mais j'ai trouvé une solution simple:

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