更新语句会使字段更新为NULL或最大值
如果您必须选择以下两个查询中的一个,那么您会选择以下哪个查询以及原因:
UPDATE `table1` AS e
SET e.points = e.points+(
SELECT points FROM `table2` AS ep WHERE e.cardnbr=ep.cardnbr);
要么:
UPDATE `table1` AS e
INNER JOIN
(
SELECT points, cardnbr
FROM `table2`
) AS ep ON (e.cardnbr=ep.cardnbr)
SET e.points = e.points+ep.points;
表的定义:
CREATE TABLE `table1` (
`cardnbr` int(10) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`points` decimal(7,3) DEFAULT '0.000',
`email` varchar(50) NOT NULL DEFAULT 'user@company.com',
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25205 DEFAULT CHARSET=latin1$$
CREATE TABLE `table2` (
`cardnbr` int(10) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`points` decimal(7,3) DEFAULT '0.000',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$
更新:两者都造成问题,首先是导致不匹配的行更新到NULL。 第二个是使它们更新到最大值999.9999(十进制7,3)。 PS cardnbr字段不是关键
首先,这两个陈述并不相同,正如你发现你自己。 第一个将更新table1
所有行,为table2
没有相关行的行添加NULL
值。
所以第二个查询看起来更好,因为它不会更新table1
所有行。 它可以用更简单的方式书写,就像这样:
UPDATE table1 AS e
INNER JOIN table2 AS ep
ON e.cardnbr = ep.cardnbr
SET e.points = e.points + ep.points ;
所以,如果cardnbr
是table2
的主键,那么第二个查询将是最好的。 是吗?
如果不是,那么从表2值应该被用于表1的更新(添加到points
)? 他们全部? 你可以使用这个:
UPDATE table1 AS e
INNER JOIN
( SELECT SUM(points) AS points, cardnbr
FROM table2
GROUP BY cardnbr
) AS ep ON e.cardnbr = ep.cardnbr
SET
e.points = e.points + ep.points ;
其中只有一个? 这需要一些其他派生表,具体取决于你想要的。
我更喜欢第二个..因此,这是理所当然的
使用JOIN
,数据库可以创建一个更适合查询的执行计划并节省时间,而子查询(如第一个)将运行所有查询并加载所有需要时间的数据。
我认为子查询很容易阅读,但性能明智JOIN
速度更快...
上一篇: Update statement causes fields to be updated with NULL or maximum value