จะอัปเดตหนึ่งตารางตามค่าของตารางอื่นได้อย่างไร


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

มีประมาณ 100,000 ระเบียนในตาราง ips มีแบบสอบถามใด ๆ สำหรับสถานการณ์ต่อไปนี้:
ตรวจสอบว่าips.isoเท่ากับcountry.isoถ้ามันเท่ากันแล้วเพิ่ม country.coutryid ไปยังระเบียนนั้น ฉันคิดไม่ออกเลยว่าจะทำอย่างไร คุณมีความคิดวิธีการทำเช่นนั้น?

คำตอบ:


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

การใช้ MySQL ปรับปรุงไวยากรณ์ตารางหลายตาราง:

14.2.11 ไวยากรณ์ UPDATE

โปรดทราบว่าคุณมีความยาวและประเภทข้อมูลที่แตกต่างกันสองรายการในคอลัมน์ iso ของคุณ ในความเป็นจริงมีสองชุดรหัส ISO แยกต่างหาก 2 ตัวอักษรและ 3 ตัวอักษรดังนั้นคุณอาจไม่สามารถเข้าร่วมคอลัมน์เหล่านี้ได้:

ISO 3166-1

เงื่อนไขการเข้าร่วมUSING (iso)แทนที่จะON ips.iso = country.isoทำงานเช่นกัน


คุณเป็นอัจฉริยะที่คุณตอบได้ช่วยประหยัดเวลาของฉัน
ฮัมฟรีย์

มันทำให้ฉันประหลาดใจว่าจำเป็นต้องใช้รหัสขนาดเล็กเพียงใดในการดำเนินการนี้!
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


4

ขอบคุณ @Cade แต่ฉันพบวิธีง่ายๆสำหรับมัน:

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

5
มีความแตกต่างในพฤติกรรมของรุ่นของฉัน - รุ่นของคุณจะตั้งเป็น NULL หากไม่พบฉันจะไม่เปลี่ยนค่าที่มีอยู่หากไม่ตรง สิ่งนี้อาจจะใช่หรือไม่ก็ได้ นอกจากนี้แผนการดำเนินการอาจแตกต่างกันขึ้นอยู่กับเครื่องมือเพิ่มประสิทธิภาพ
เคดรูส์

@CadeRoux ฉันไม่ได้คิดเกี่ยวกับส่วน NULL ขอบคุณ
ALH

1
@ john.locke อาจไม่ใช่ปัญหา - เมื่อคุณเพิ่มคอลัมน์ใหม่ฉันถือว่าเป็น NULL และเป็น foreign key ดังนั้นจึงไม่อนุญาตให้ป้อนข้อมูลที่ไม่ถูกต้อง แต่มันยากที่จะบอกจากสิ่งที่ได้รับอย่างชัดเจนในคำถามของคุณ
เคดรูส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.