这是我的第一个问题,所以请耐心等待。:)
我们是两个开发人员,都有相同的MySql DB,具有相同的表和值。
一个是MySql版本5. 5,工作正常(显然),正如其他开发人员告诉我的那样。
在我的机器与MySql 5.1.44(一个基本的MAMP安装)我有以下奇怪的问题。
一个非常大的查询(不是我的)失败,错误是“Column 'xd' cannot be null”。
删除件我slimmedi它到这个:
select xd, avg(media) from questionario_punteggi where somefield = 1 union select 1,2
注意,没有somefield = 1的记录,所以第一次select返回一个空集
我们有一个带有AVG()函数的SELECT,它返回一个空集UNION,另一个SELECT返回一些东西(我现在举个例子,1,2只是随机值)
- 如果我删除AVG(),查询就可以工作。
- 如果我删除xd(和右边的2,1,2),查询就可以工作了。
- 如果我删除UNION,查询就可以工作。
- 如果我用somefield = 1设置某个记录,查询就可以工作。
- 在另一台机器5.5上,查询工作。
否则,错误为:
1048 -列'xd'不能为null
字段包括:
`xd` char(3) NOT NULL DEFAULT '001',
`media` decimal(7,4) NOT NULL DEFAULT '0.0000',
`somefield` tinyint(4) NOT NULL DEFAULT '0',
天啊。有什么能帮忙的吗?谢谢。
更新
在MySql〈= 5.1中有BUG报告给我,在MySql 5.5之前已经修复,具体情况我不清楚,但我相信来源
2条答案
按热度按时间ui7jx7zq1#
尝试使用
SELECT IFNULL();
http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull
h9a6wy2h2#
我建议颠倒
UNION
中的查询顺序。这是因为
UNION
中的第一个SELECT
决定了结果集中列的数据类型;在您的示例中,UNION
的第一列采用questionario_punteggi.xd
列的类型:即CHAR(3) NOT NULL
。由于您对
UNION
的第一部分应用聚合函数,因此即使 * 没有记录与过滤条件匹配,它也会导致单行 *。如GROUP BY
(Aggregate) Functions中所述:AVG()
返回NULL
,如果没有匹配的行。hiddenx 1 m10n1x列的值通常是从匹配过滤器的记录中不确定地选择的记录(这就是为什么您可能不想这样做的原因);但是,由于在这种情况下没有匹配的记录,服务器返回
NULL
(显然不能进入具有NOT NULL
属性的列)。通过颠倒
UNION
的顺序,该列将不具有NOT NULL
属性。您可能需要适当地为列设置别名:用这个来依次解释你的每一个观察结果:
由于不再执行聚合,因此
UNION
中的第一个SELECT
将生成一个空记录集,因此第一列中没有NULL
记录。由于隐藏列不再被选中,MySQL不再返回
NULL
。这是您的MySQL版本和您同事的版本之间可能已修复的错误:
NOT NULL
属性不应该真正应用于UNION
结果。为隐藏列选择的值是匹配记录中的不确定值(但由于列的属性,它不是
NULL
值)。这个bug(我还在寻找它)必须在你各自的MySQL版本之间得到修复。