it-swarm.com.de

Wie aktualisiere ich eine Tabelle basierend auf den Werten einer anderen Tabelle im laufenden Betrieb?

Ich habe eine Tabelle im Namen von ips wie folgt:

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

Nehmen wir an, ich habe ein countryid Feld in dieser Tabelle aus der Ländertabelle, das wie folgt lautet:

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

Es gibt ungefähr 100.000 Datensätze in der ips-Tabelle. Gibt es eine Abfrage für das folgende Szenario:
Überprüfen Sie, ob ips.iso entspricht country.iso, wenn es gleich ist, fügen Sie country.coutryid zu diesem Datensatz hinzu. Ich konnte mir keine Möglichkeit vorstellen, es zu tun. Hast du eine Idee, wie das geht?

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

Verwenden der MySQL-Update-Syntax für mehrere Tabellen:

14.2.11 UPDATE-Syntax

Beachten Sie, dass Ihre ISO-Spalten zwei unterschiedliche Längen und Datentypen haben. Tatsächlich gibt es zwei separate Sätze von ISO-Codes, 2-Buchstaben und 3-Buchstaben, sodass Sie diese Spalten möglicherweise in Wirklichkeit nicht verbinden können:

ISO 3166-1

Die Join-Bedingung USING (iso) anstelle von ON ips.iso = country.iso Funktioniert ebenfalls.

76
Cade Roux

Die Lösung von @Cade Roux gibt mir einen Syntaxfehler. Der richtige für MySQL 5.5.29 lautet:

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

ohne das Schlüsselwort "FROM".

33
linuxatico

Diese Syntax ist möglicherweise besser lesbar

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

danke @Cade, aber ich habe eine einfache Lösung dafür gefunden:

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