我想用一个 UPDATE 查询更新两个表。为此,我使用了一个简单的 LEFT JOIN。奇怪的是,并非所有匹配的行都被更改。这是示例表:
DROP TABLE IF EXISTS `test_continents`, `test_agents`;
CREATE TABLE IF NOT EXISTS `test_continents` (
`key` char(2) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED;
INSERT INTO `test_continents` (`key`) VALUES('EU');
INSERT INTO `test_continents` (`key`) VALUES('NA');
CREATE TABLE IF NOT EXISTS `test_agents` (
`name` char(64) COLLATE utf8_unicode_ci NOT NULL,
`continent` char(2) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
PRIMARY KEY (`name`),
KEY `continent` (`continent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED;
INSERT INTO `test_agents` (`name`, `continent`) VALUES('006', 'EU');
INSERT INTO `test_agents` (`name`, `continent`) VALUES('007', 'EU');
INSERT INTO `test_agents` (`name`, `continent`) VALUES('008', 'NA');
INSERT INTO `test_agents` (`name`, `continent`) VALUES('009', 'NA');
OPTIMIZE TABLE `test_continents`, `test_agents`;
这是示例 SELECT 查询,它匹配所有行:
SELECT
`test_agents`.`continent`,
`test_agents`.`name`
FROM `test_continents`
LEFT JOIN `test_agents` ON (
`test_agents`.`continent` = `test_continents`.`key`
)
WHERE
`test_continents`.`key` = 'NA'
这是更新查询:
UPDATE `test_continents`
LEFT JOIN `test_agents` ON (
`test_agents`.`continent` = `test_continents`.`key`
)
SET
`test_continents`.`key` = 'SA',
`test_agents`.`continent` = `test_continents`.`key`
WHERE
`test_continents`.`key` = 'NA'
更新后,表格如下所示:
测试大陆:
key
EU
SA
测试代理:
name continent
006 EU
007 EU
008 SA
009 NA
谁能解释一下为什么更新后 test_agent 009 的大陆字段仍然是“NA”?
如果我使用INT字段似乎不会发生这种情况,但是我需要CHAR(2)字段,所以请不要讨论表结构,只是说我这是一个错误,一个功能还是其他什么?
我正在使用 Ubuntu 12.04 和 MySQL 5.5.29-1~dotdeb.0 我是 15 年多以来的编码员,通常我不会问这样的问题,但我无法解释它,我需要帮助......
更新:
我用 INT(2) 字段而不是 CHAR(2) 做了第二个例子。在这种情况下,UPDATE 匹配所有行:
CREATE TABLE IF NOT EXISTS `test_agents` (
`name` char(64) COLLATE utf8_unicode_ci NOT NULL,
`continent` int(2) NOT NULL DEFAULT '0',
PRIMARY KEY (`name`),
KEY `continent` (`continent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED;
INSERT INTO `test_agents` (`name`, `continent`) VALUES('006', 1);
INSERT INTO `test_agents` (`name`, `continent`) VALUES('007', 1);
INSERT INTO `test_agents` (`name`, `continent`) VALUES('008', 2);
INSERT INTO `test_agents` (`name`, `continent`) VALUES('009', 2);
CREATE TABLE IF NOT EXISTS `test_continents` (
`key` int(2) NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED;
INSERT INTO `test_continents` (`key`) VALUES(1);
INSERT INTO `test_continents` (`key`) VALUES(2);
--
SELECT
`test_agents`.`continent`,
`test_agents`.`name`
FROM `test_continents`
LEFT JOIN `test_agents` ON (
`test_agents`.`continent` = `test_continents`.`key`
)
WHERE
`test_continents`.`key` = 2
--
UPDATE `test_continents`
LEFT JOIN `test_agents` ON (
`test_agents`.`continent` = `test_continents`.`key`
)
SET
`test_continents`.`key` = 3,
`test_agents`.`continent` = `test_continents`.`key`
WHERE
`test_continents`.`key` = 2
更新后的 test_agents:
name continent
006 1
007 1
008 3
009 3
--
我不敢相信这是一种正常的行为。两个示例之间的唯一区别是字段类型,所以它是否应该影响相同的行?我确信查询是 100% 正确的。
有没有人解释???
提前致谢。