在表中重复列名有什么用吗?

2024-03-31

在 sqlite3 中,我可以强制两列使用相同的名称,如以下查询所示:

SELECT field_one AS overloaded_name,
       field_two AS overloaded_name
FROM my_table;

它返回以下内容:

overloaded_name  overloaded_name
---------------  ---------------
1                2
3                4
...              ...

... 等等。

但是,如果我使用相同的语法创建一个命名表,它会在其中一个别名后面附加一个:1:

sqlite> CREATE TABLE temp AS
          SELECT field_one AS overloaded_name,
                 field_two AS overloaded_name
          FROM my_table;
sqlite> .schema temp
CREATE TABLE temp(
  overloaded_name TEXT,
  "overloaded_name:1" TEXT
);

我运行原始查询只是为了看看这是否可行,令我惊讶的是它被允许了。这样做有什么充分的理由吗?假设不存在,为什么允许这样做?

EDIT:

我应该澄清:问题是双重的:为什么允许表创建成功,以及(更重要的是)为什么首先允许原始选择?

另外,请参阅我上面关于表创建的说明。


我可以强制两列使用相同的名称... 为什么[this]首先被允许?

这可以归因于兼容性的束缚 http://www.dcs.warwick.ac.uk/~hugh/TTM/Importance-of-Column-Names.pdf。在 SQL 标准中,没有任何内容被弃用。标准的早期版本允许表表达式的结果包含具有重复名称的列,可能是因为有影响力的供应商允许这样做,可能是由于包含错误或省略设计功能,并且没有做好准备冒破坏客户代码的风险(再次兼容性的束缚)。

在表中重复列名有什么用吗?

。仅仅因为 SQL 允许重复的列名,并不意味着作为 SQL 编码人员您应该利用此类功能;事实上,我想说你必须保持警惕,不要错误地调用此功能。我想不出在表中存在重复列名的任何充分理由,但我可以想到许多明显的不好的理由。这样的桌子不会成为一种关系,这也不是什么好事!

为什么[基]表创建可以成功

毫无疑问,这是对 SQL 标准的“扩展”(也称为故意违反),我认为它可以被视为一个合理的功能:如果我尝试创建具有重复名称的列,系统会自动通过添加序数后缀来消除它们的歧义。事实上,SQL 标准指定有一种依赖于实现的方法来确保表表达式的结果不会隐含地有重复的列名(但正如您在问题中指出的那样,这并不妨碍用户明确地使用重复的AS条款)。然而,我个人认为不允许重复名称并引发错误的标准行为是正确的。除了上述原因(即同一个表中的重复列没有什么用处)之外,在不知道系统是否遵循该名称的情况下创建对象的 SQL 脚本很容易出错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在表中重复列名有什么用吗? 的相关文章

随机推荐