表名或列名不能以数字开头?

2024-05-01

我尝试创建名为15909434_user语法如下:

CREATE TABLE 15909434_user ( ... )

这当然会产生错误。然后,在我尝试用谷歌进行一些研究后,我发现了一篇很好的文章here http://www.informit.com/articles/article.aspx?p=409471描述:

当您在 PostgreSQL 中创建对象时,您需要为该对象指定一个名称。每个表都有一个名称,每个列都有一个名称,等等。 PostgreSQL 使用单一数据类型来定义所有对象名称:name type.

类型的值name是 63 个或更少字符的字符串。名称必须以字母或下划线开头;字符串的其余部分可以包含字母、数字和下划线。

...

如果您发现需要创建不符合这些规则的对象,可以将名称用双引号引起来。将名称括在引号中会创建带引号的标识符。例如,您可以创建一个名为“3.14159"—双引号是必需的,但实际上并不是名称的一部分(即,它们不会被存储,也不会计入 63 个字符的限制)。...

好的,现在我知道如何使用以下语法来解决这个问题(在表名上加上双引号):

CREATE TABLE "15909434_user" ( ... )

您可以创建表或列名称,例如"15909434_user"并且user_15909434,但无法创建以数字开头而不使用双引号的表或列名称。

那么,我很好奇其背后的原因(除非这是一个约定)。为什么要应用这个约定?是为了避免语法限制还是其他原因?

预先感谢您的关注!


它来自于原始的sql标准,经过几层间接最终得到一个标识符开始块,这是几件事之一,但主要是“一个简单的拉丁字母”。还有其他东西可以使用,但是如果您想查看所有详细信息,请访问http://en.wikipedia.org/wiki/SQL-92 http://en.wikipedia.org/wiki/SQL-92并点击实际标准的链接(第 85 页)

使用非数字标识符引入符可以使编写解析器来解码 sql 以便更轻松、更快速地执行,但带引号的形式也可以。


编辑:为什么解析器更容易?

解析器的问题更多在于SELECT-list 子句比FROM条款。选择列表是从表中选择的表达式列表,这非常灵活,允许简单的列名和数字表达式。考虑以下:

SELECT 2e2 + 3.4 FROM ...

如果表名和列名可以以数字开头,则2e2列名或有效数字 (e格式通常在数字文字中允许)并且是3.4桌子 ”3“和栏”4“或者是数值3.4 ?

有这样的规则身份标识以简单的拉丁字母(以及其他一些特定的东西)开头意味着解析器看到2e2可以很快看出这将是一个数值表达式,同样处理3.4

虽然可以设计一个允许数字前导字符的方案,但这可能会导致更加模糊的规则(意见),所以这个规则是一个很好的解决方案。如果您首先允许使用数字,那么它总是需要引用,这可以说不是那么“干净”。


免责声明,我稍微简化了上面的内容,忽略了相关名称以保持简短。我对 postgres 并不完全熟悉,但已经根据 Oracle RDB 文档和 sql 规范仔细检查了上面的答案

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

表名或列名不能以数字开头? 的相关文章

  • Postgres where 子句比较时间戳

    我有一个表 其中列的数据类型timestamp 其中包含一天的多条记录 我想选择与日期对应的所有行 我该怎么做 Assuming you actually mean timestamp because there is no datetim
  • 实体框架 - 查询可为空列时出现问题

    我在从具有可为空的tinyint 列的表中查询数据时遇到问题 问题似乎是查询生成为 AND CAST Extent1 PositionEffect AS int p linq 3 gt p linq 3 NULL 如果我手动运行该查询 它不
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • 查找 postgres 提供的列表中不存在的值

    我试图找到一个查询来告诉我数据库中没有的值 例如 select seqID segment from flu where seqID IN 1 2 3 4 5 6 7 8 9 现在 如果我的数据库没有 seqID 3 8 9 我将如何查找
  • 在Oracle中查找不包含数字数据的行

    我试图在一个非常大的 Oracle 表中找到一些有问题的记录 即使该列是 varchar2 列 也应包含所有数值数据 我需要找到不包含数字数据的记录 当我尝试在此列上调用 to number col name 函数时 它会抛出错误 我想你可
  • 按每月时间为用户标记标签

    数据源 User ID Visit Date 1 2020 01 01 12 29 15 1 2020 01 02 12 30 11 1 2020 04 01 12 31 01 2 2020 05 01 12 31 14 Problem 我
  • 选定的非聚合值必须是关联组的一部分

    我在 Teradata 中有两个表 Table A 和 Table B 它们之间是 LEFT JOIN 之后我将创建 SELECT 语句 其中包含两个表中的属性 SELECT attribute 1 attribute 2 attribut
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • mysql LIKE 查询时间太长

    SQL SELECT COUNT usr id as total results FROM users as usr LEFT JOIN profile as prof ON prof uid usr uid WHERE usr usern
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 有没有办法在插入查询中执行另一个查询?

    好的 这是我的查询 我刚刚添加了 ACCOUNTID 和 accountID 部分 这显然不起作用 INSERT INTO Leads LEADID CREATEUSER CREATEDATE FIRSTNAME MODIFYDATE AC
  • postgresql中数组的区别

    我有两个数组 1 2 3 4 7 6 and 2 3 7 在 PostgreSQL 中可能有共同的元素 我想做的是从第一个数组中排除第二个数组中存在的所有元素 到目前为止我已经取得了以下成果 SELECT array SELECT unne
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • 如何使用sql脚本更改列的属性

    如何使用 sql 脚本更改列的属性 这是我尝试过但出现错误的方法 ALTER TABLE dbo tblBiometricPattern COLUMN BiometricPatternID TINYINT NOT NULL IDENTITY

随机推荐