【问题标题】:Why shouldn't commas be included in sql field names?为什么不应该在 sql 字段名称中包含逗号?
【发布时间】:2013-09-13 07:31:10
【问题描述】:

人们一直告诉我,列名中不应包含空格。我只是想知道,这是为什么呢?这是我为学校创建的一些数据库表遇到的问题。字段名称包括 Preble 和 Darke。

相反,它们必须是“Preble County (OH)”和“Darke County (OH)”。如果它们是行名,我只需创建一个 ID # 列,然后自然地将其与显示我希望它们的名称的表连接起来(“Darke County (OH)”而不是“Darke”)。

但是,我不知道如何更改这些名称,因为它们是我的字段名称。谁能帮我吗?任何帮助将不胜感激。

【问题讨论】:

  • 你想知道为什么你不应该在字段名称中包含逗号(或看起来像是空格)或ALTER TABLE 语法来删除空格吗?
  • 例如,为什么字段名不应该是Darke County (OH)
  • 因为必须在每个列和表名周围使用反引号(或双引号)只会使查询混乱,使其更难理解和输入。
  • 好的,有什么办法可以自然地连接两个表,所以当我打印列名时,我可以打印Darke County (OH) 而不是Darke
  • 表名中的空格和逗号等内容会为您创造更多的工作量。每次在查询中引用表时,您都必须做一些事情来转义非标准字符。使用 sql 关键字作为表名也是如此。在某些数据库引擎中,数据类型也是如此。

标签: php mysql sql database field


【解决方案1】:

tldr; 尝试包含逗号(或其他特殊字符)通常表示列名存在根本缺陷2

这是一个糟糕的数据库设计。 不好,因为它试图将信息编码成列名1。这不是列名的重点!列名只是记录/元组元素的友好名称 - 仅此而已。在关系代数 (RA) 和 SQL 中,包含信息的是记录/元组。

除了导致难以处理的模式(额外的引用语法)需要基于不断变化的信息(列名和多重性)进行硬编码查询之外,它也无法与许多 RA 技术一起使用一种灵活的方式。 RA 通常只能处理跨记录的多重性 - 并且据发现,这包括连接。

相反,架构应该类似于:

县州其他栏目
======= ===== ==============
达克哦..
普雷贝尔哦..

密钥在哪里,比如(State,County) 和“其他列”取决于密钥。当然,模型应该根据捕获的所有其他信息正确归一化。

请注意,上面显示的列名中没有存储任何信息:这些名称只是表示存储在每列中的信息的友好名称。


1 现在可以根据需要执行主要用于人工输出/显示的PIVOT transformation。这是输出表(不是模式表!)中的一列,是每组记录值生成的。但是,这是次要问题,不应影响主架构。

如果使用 SQL Server,可以首先 UNPIVOT 填充信息的列名,执行连接,然后重新 PIVOT(给定一组已知的列名)。但是,我不知道这将如何在 MySQL 中完成 - 也许是一个混乱的动态查询。无论如何,这是我会避免的方法。


2 虽然 裸标识符 中不允许使用特殊字符,但在 带引号的标识符 中使用时可以使用此类名称 - 例如`Vancouver, WA` 或 ANSI quotes, "Vancouver, WA"。但是,请继续阅读反对使用此类标识符的其他回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2011-08-18
    • 2015-11-28
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多