选择不存在列的行为

时间:2014-08-19 18:54:40

标签: sql

给定一个具有这种结构的表:

create table person (
  id int identity primary key,
  name varchar(256),
  birthday datetime
)

对于此查询:

select id,name,birthday,haircolor from person

在这种情况下SQL抛出错误的理由是什么?我正在考虑如果查询只是为不存在的列返回null,那将是多么灵活。这种SQL语言设计的具体原因是什么?

5 个答案:

答案 0 :(得分:4)

不,因为那时你假设有一个haircolour列可能会产生以下影响,就像一个例子:

  1. 您认为可以插入字段,因为您会认为该列存在,
  2. 返回的结果不能准确表示数据库架构。
  3. 给出错误,以便您可以清楚地了解和指示您可以和     无法做到。它也在那里,所以你可以尽快捕捉异常,错误,蜘蛛,当然还有令人毛骨悚然的爬行。 :)

    我们不想容纳懒惰的开发者。

    Do the right thing, be a man - Russel Peters。

答案 1 :(得分:3)

由于许多原因,这将是不一致的。一个简单的例子是使用*来选择列:当你这样做时

select id, name, birthday, hair_color from person

然后返回一个包含所有四列的表格(hair_color在所有行上设置为null)您会合理地期望下面的查询

select * from person

返回至少四列,并且返回的列中包含hair_color。但是,如果SQL允许不存在的列返回null,则不会出现这种情况。

当在模式中重命名列时,这也会产生难以发现的错误,但是某些查询或存储过程无法重新处理以匹配新名称。

但是,一般情况下,SQL引擎开发人员会在可用性和" hard"之间进行权衡。错误检查。有时,他们会放松一两个约束,以适应一些最常见的简单"错误(例如忘记在分组查询中使用聚合函数;这是一个错误,但是MySql可以让你逃脱它)。但是,在架构检查方面,SQL引擎不允许任何自满情绪,将所有缺失的架构元素视为错误。

答案 2 :(得分:1)

MySQL里面有一个可怕的错误......

select field1,field2,filed3
from table 
group by field1

任何数据库引擎都会返回'错误,当我们不是聚合时也不会在选择行中使用field2和field3,也不会在group by语句中使用'。

另一方面,MySQL会返回字段2和3的两个随机值,而不会返回错误(我称之为'做错了而不返回错误')。这是一个可怕的错误,发现MySQL的故障排除的脚本数量不正确处理组是荒谬的...在给出无意结果之前给出错误并且这个巨大的错误不会是这样的问题

在您看来,您是否要求传播更多这种愚蠢的行为......只是在select子句而不是group by子句中?

编辑:

错字传播。

从...中选择年龄,性别,黑色;

我更愿意回复一句错误的错误'伟大的拼写错误'而不是一个充满空名的错误名称字段。

答案 3 :(得分:1)

这会导致无声错误问题。编译时错误和运行时异常的全部原因是为了尽快捕获错误。

如果你的列名中有拼写错误并且它返回null而不是错误,那么你的应用程序将继续工作,但结果会导致各种错误。您可能会有一个列保存用户设置,表明他们不想接收电子邮件。但是,您的查询有一个拼写错误,所以它总是返回null。渐渐地,一些人开始报告他们正在设置"不发送电子邮件"设置但仍在收到电子邮件。你必须搜索所有代码才能找出原因。首先,您查看编辑此设置的表单,然后在调用数据库以保存设置的代码中,然后验证数据是否存在并保持设置,然后查看发送电子邮件的系统,并运行直到那里的数据库层,它检索设置并仔细查看SQL中的错字。

如果它刚刚抛出错误,该过程会变得多么容易?没有用户感到沮丧。没有浪费时间支持请求。没有浪费时间进行故障排除。

答案 4 :(得分:0)

返回null将过于通用。我更喜欢这种方式。在您的流程中,您可能会捕获错误并在需要时返回null。但是,提供有关查询失败原因的更多信息比接收null更好(并且可能让您在JOIN和WHERE子句上划伤