在 MS SQL Server 中创建作为保留字/关键字的表名 [关闭]
Posted
技术标签:
【中文标题】在 MS SQL Server 中创建作为保留字/关键字的表名 [关闭]【英文标题】:Creating table names that are reserved words/keywords in MS SQL Server [closed] 【发布时间】:2009-03-29 23:06:59 【问题描述】:可以命名我已经是关键字的数据库表吗?就我而言,我试图命名将容纳我的用户的表。我已将其命名为 User,但它在 SQL Server Management Studio 中显示为粉红色,因此我假设它是现有的系统表或关键字。谢谢你的建议。
官方保留关键字列表:Reserved Keywords (Transact-SQL)
【问题讨论】:
对于 mysql:答案如下:SELECT * FROM 'keys' 有效 - 在我的 phpmyadmin 中将表名放在单引号中。因此,没关系。 (但不推荐)。 【参考方案1】:重复三遍:
不要这样做,我不会使用保留字!
你会感谢我的!
【讨论】:
为什么要折磨后来维护你代码的人,甚至折磨你自己? 不同意。无论如何,将表名括起来是个好习惯。我使用过的每个 SQL 工具,无论是 MSFT 还是第三方,都会自动执行此操作。所以在实践中,它并没有太大的区别。 不幸的是,很多保留关键字在日常生活中都有实际用途(即user
、file
、text
、view
)
我们也不要忘记保留字会随着版本的变化而变化。回到 SQL Server 7 天,人们在很多代码中使用了表名“Function”,当他们将数据库升级到 SQL 2000 时发现它坏了,FUNCTION 成为保留字。长话短说:在生产代码中,始终转义您的对象名称!
可以这么说,但创建表的并不总是您。鉴于该表存在,并且您无法更改它 - 这样的答案并没有真正帮助。【参考方案2】:
您可以创建与关键字同名的表。如果您“引用”表名,它应该可以工作。 SQL server 中的默认引号是方括号:[]
CREATE TABLE [dbo].[user](
[id] [bigint] NOT NULL,
[name] [varchar](20) NOT NULL
) ON [PRIMARY]
【讨论】:
您应该始终引用所有字段名称。您永远不知道在未来的数据库中什么可能成为保留字。它永远不会造成任何伤害。 谢谢!我已经有了保留关键字的列名,我已经厌倦了这个问题的糟糕“答案”(好吧,我的问题更多是关于访问而不是创建),基本上是“不要”。 你成功了!谢谢【参考方案3】:是的,没关系。在您的查询中,您可以将 [ 和 ] 放在您的表名周围,以便 SQL Server 知道您指的是一个表 - 即
CREATE TABLE [User] ...
SELECT * FROM [User]
【讨论】:
【参考方案4】:您可以使用 [用户] 来执行此操作。尽可能使用与关键字不冲突的表名,以避免混淆和错误。
【讨论】:
【参考方案5】:对于 MS Query,我发现双引号在 Query 中非常有效。
select T1."Reference"
from MyTable T1
【讨论】:
【参考方案6】:字符串使用“单引号”,列名使用“双引号”。
例子:
INSERT INTO AccountMovement
("Date", Info)
VALUES
('2012/03/17', 'aa'),
('2012/03/17', 'bb'),
('2012/03/17', 'cc'),
('2012/03/17', 'dd')
【讨论】:
【参考方案7】:我认为表名应该是复数,所以在你的情况下应该是用户。
我喜欢这种约定,因为它对我来说很有意义。您有一组用户,因此请调用您的表。如果您拉出一个单独的行,然后可以填充一个名为 User 的对象,则进一步向下流。
如果您的惯例要求表名使用单数,请使用不同的名称,例如:成员、客户等。
另见 RacerX 的回答!
如前所述,如果您 [Braket] 名称,在技术上是可以的。
【讨论】:
我也采用复数形式,只是为了避免使用保留关键字。此外,使用保留关键字可能会导致不正确的突出显示问题。 MEMBER 在 SQL:2003 中保留!【参考方案8】:如前所述,您可以通过引用名称来做到这一点。当然,您还必须在引用该名称时引用它 - 相信我,它很快就会变老。
顺便说一句,仅仅因为 SSMS 语法为单词着色并不一定意味着它是 reserved word。 Sql 可能会很烦人。 ;)
【讨论】:
【参考方案9】:表名和列名的基本规则(或一般更好的对象名):
不要使用任何与保留字相同或什至相似的内容。仅使用 A-Za-z0-9 和下划线。特别是不要使用空格。只使用不需要转义的名称,然后不要将转义用作永久测试。
您以及与您一起工作或将要处理您的代码的每个人都不需要恶化。
【讨论】:
【参考方案10】:正如其他人所说,不要这样做;然而,我在同一条船上。我有一条规则说我所有的表都以单数形式存储。组织不是组织,资产不是资产 PartsCatalog 有很多 Part 等。
好吧,我有一个 User 表,我该怎么称呼它?我最终逃脱了它[用户]。现在我后悔那个决定,因为我总是忘记逃离桌子;不过,我还没想出更好的名字:Member 是主要候选人。
【讨论】:
我把我的用户放在一个“Person”表中。 :) 但是如果您需要对非用户的人进行建模怎么办? 最好有另一个名字,即使它不完美(阅读:会员),而不是每次忘记引用用户时继续受到打击。 无论如何,您应该始终引用每个表和列名。一旦你开始做,就很容易了。 MEMBER 在 SQL:2003 中保留!【参考方案11】:不是一个好主意 - 出于各种充分的理由
为什么不这样做的更多原因 1) 与保留名称的明显可能冲突 2)如果您想在两年内在表单字段中或任何您在使用通用名称时被搞砸的地方的代码中进行全局替换 3) 如果您需要在代码中搜索使用“用户”的场合 - 您知道它的去向(我们有超过一百万行代码,它会杀死我们)。
我们做了什么 1)每个表名都有一个唯一的开头,例如对象的 O_nnn 财务数据的 F_nnn ......我们将相同的字段应用于 opp_created 等字段,因为机会是在日期创建的,SUSR_RID 用于引用销售功能中的用户 ID,而 OPUSR_RID 是可操作的参考用户... 2) 除了前缀,我们使用尽可能明显的名称,例如 O_FlightArrivalTime 而不是 O_FltAT。今天的数据库没有显示出更长名称的性能下降。 3) 现在,当使用 OF_FlightArrivalTime 作为 Formfield 名称时,您可以轻松找到关联,但全局搜索 O_F... 只会找到 DB 字段、搜索 OF_F... 表单字段和 _F.... 两者.
【讨论】:
以上是关于在 MS SQL Server 中创建作为保留字/关键字的表名 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中创建聚集索引,同时仍保留主键?
如何在 MS SQL Server 中创建链接服务器到 Netezza
在 SQL Server 2012 中创建以日期为范围分区的表