mysql - 更新语句导致字段更新为 NULL 或最大值

标签 mysql sql sql-update

如果您必须从以下两个查询中选择一个,您会选择哪个以及为什么:

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 字段不是键

最佳答案

我更喜欢第二个..原因是

当使用 JOIN 时,数据库可以创建一个更适合您的查询并节省时间的执行计划,而子查询(如您的第一个)将运行所有查询并加载所有可能需要的数据时间。

我认为子查询很容易阅读,但性能方面 JOIN 更快...

关于mysql - 更新语句导致字段更新为 NULL 或最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14702335/

相关文章:

php - PHP/MySQL PDO 的奇怪行数返回

php - 数组值存入mysql

php - MySQL插入数据问题

postgresql - PostgreSQL 有没有办法自动设置记录更新的时间?

mysql - 在不使用 SELECT 的情况下将 bool 值更新为其相反的 SQL

php - 如果用户正确输入电子邮件,我该如何正确显示错误并继续?

android - instr() 函数 SQLITE for Android?

sql - 通过排除重叠本身,将具有优先级的重叠时间段的持续时间相加

MySQL根据邮政编码更新

mysql - IF语句MYSQL中的SUBSTR()函数