sql - 在表中复制列名有什么用吗?

标签 sql sqlite

在 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
);

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

编辑:

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

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

最佳答案

I can force two columns to alias to the same name... why is [this] allowed in the first place?

这可以归因于 shackles of compatibility .在 SQL 标准中,没有任何东西被弃用。该标准的早期版本允许表表达式的结果包含具有重复名称的列,这可能是因为有影响力的供应商允许这样做,可能是由于包含错误或遗漏设计功能,并且没有准备好冒着破坏客户代码的风险(又是兼容性的束缚)。

Is there any use to duplicate column names in a table?

In the relational model, every attribute of every relation has a name that is unique within the relevant relation .仅仅因为 SQL 允许重复的列名并不意味着作为 SQL 编码员您应该使用诸如功能;事实上我会说你必须警惕不要错误地调用这个功能。我想不出任何在表中使用重复列名的充分理由,但我可以想到许多明显的错误。这样的表不是关系,也不是什么好事!

why is the [base] table creation allowed to succeed

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

关于sql - 在表中复制列名有什么用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8797593/

相关文章:

Sqlite - 在一条语句中进行 SELECT 或 INSERT 和 SELECT

java - JasperServer 错误 - 无法获取下一条记录

python - MySQL - 按两列分组

sql - 在 Apache Superset 中添加 Druid 集群作为 SQL 数据库

android - 如何用相机拍照并将其保存到数据库并在 Android 的 listView 中显示?

ios - 为什么这个 CoreData 获取这么慢?

SQL 约束条件检查 : if column0 is null, column1 不为空,反之亦然

sql - DATEDIFF 在 yyyymmdd 格式的 SQL 服务器上工作

Android:从数据库加载时在 ListView 中显示 HTML 格式的文本

sqlite - 从 C# 查询 Thunderbird 的 SQLite 消息数据库