0

我想用一个 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% 正确的。

有没有人解释???

提前致谢。

4

0 回答 0