Skip to main content
 首页 » 编程设计

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

2025年12月25日78sky-heaven

在 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 脚本很容易出错。