在MS SQL Server中创建保留字/关键字作为表名

64

如果我的数据库表已经是关键字了,我是否可以使用这些关键字来命名?对于我的情况,我正在尝试命名将保存我的用户的表。我把它命名为User,但在SQL Server Management Studio中显示为粉色,我认为它是现有的系统表或关键字。谢谢你的建议。

官方保留关键字列表:保留关键字(Transact-SQL)


对于mysql:这是答案:SELECT * FROM 'keys' works - 在我的phpmyadmin中将表名放在单引号中。因此,可以使用(但不建议)。 - ssaltman
11个回答

131

请重复三次:

不要这样做,我不会使用保留字!

你会感激我的!


2
为什么要折磨那些以后可能会维护你的代码甚至是你自己的人呢? - ojblass
15
恕我不同意。将表名用括号括起来是一个好习惯。而且,我使用过的所有 SQL 工具,包括微软和第三方工具,都会自动完成这个步骤。因此,在实际操作中,这并没有太大的区别。 - Portman
32
很不幸,许多保留关键字实际上在日常使用中都非常常见(例如 userfiletextview)。 - puk
6
别忘了每个版本之间保留字会有所变化。在 SQL Server 7 的时候,很多人在代码中使用了表名“Function”,但是当他们将数据库升级到 SQL 2000 版本时,却发现这个词成为了保留字而导致程序出错。简而言之,在生产环境的代码中,一定要转义你的对象名称! - Dave Markle
5
说出这句话没问题,但并不总是由你来创建这个表格。假如这个表格已经存在,并且你无法更改它,像这样的回答并没有真正帮助到你。 - vikingsteve
显示剩余3条评论

84

您可以创建与关键字同名的表。 如果您使用“引号”括住表名,它应该能够正常工作。 SQL服务器中默认的引号是方括号:[]。

CREATE TABLE [dbo].[user](
    [id] [bigint] NOT NULL,
    [name] [varchar](20) NOT NULL
) ON [PRIMARY]

3
您应该始终引用所有字段名。您永远不知道未来数据库中可能会成为保留字的内容。这不会造成任何伤害。 - rjmunro
谢谢!我已经有了一些列名是保留关键字的情况,而且我已经厌倦了这个问题的糟糕“答案”(我的问题更多是关于访问而不是创建),基本上都是“不要这样做”。 - ShaneTheKing
你做得很好!谢谢。 - GETah

12

没问题。你可以在查询中在表名的左右加上 [ 和 ],这样SQL Server就知道你正在引用一个表了 - 即

CREATE TABLE [User] ...
SELECT * FROM [User]

9
您可以使用 [User] 来完成此操作。如果可能的话,请使用不与关键字冲突的表名,以避免混淆和错误。

8

在IT技术中,使用单引号表示字符串,而使用双引号表示列名。

例如:

INSERT INTO AccountMovement
("Date", Info)
VALUES
('2012/03/17', 'aa'),
('2012/03/17', 'bb'),
('2012/03/17', 'cc'),
('2012/03/17', 'dd')

8

对于MS Query,我发现在查询中使用双引号效果非常好。

select T1."Reference"
from MyTable T1

6

我认为表名应该使用复数形式,因此在您的情况下应该使用“Users”。

我喜欢这种约定,因为对我来说很有意义。你有一组用户,所以称呼你的表。如果你从下游拉出一个单独的行,那么它可以填充一个名为User的对象。

如果您的约定规定表名使用单数形式,请使用不同的名称,例如:Member、Client等。

另请参阅RacerX的答案!

如先前所述,如果您[Braket]名称,则技术上是可以的。


1
我也采用复数路线,只是为了避免使用保留关键字。此外,使用保留关键字可能会导致错误的高亮问题。 - puk
在SQL:2003中,MEMBER是保留字! - Clint Pachl

3

如上所述,您可以通过引用名称来执行此操作。当然,每次引用它时,您也必须引用该名称 - 相信我,这很快就会变得老套。

顺便说一句,仅因为SSMS语法突出显示该单词并不一定意味着它是保留字。 SQL可能会让人感到烦恼。;)


3

表格和列名(或者更一般的对象名)的基本规则:

不要使用任何与保留字相同或相似的内容。只能使用A-Za-z0-9和下划线。特别是不要使用空格。只使用不需要转义的名称,然后不要将转义用作永久测试。

你和与你一起工作或者将来会处理你的代码的所有人都不需要这种麻烦。


3

正如其他人所说,不要这样做;然而,我曾经也面临同样的问题。我的规则是所有表格都以单数形式存储。Organization而不是Organizations,Asset而不是Assets,PartsCatalog有很多Part等。

我有一个User表格,那么我该怎么称呼它呢?我最终选择了转义[User]。现在我后悔了这个决定,因为我总是忘记转义表格;但是,我还没有想出更好的名称:Member是首选。


我将我的用户放在一个“Person”表中。 :) - David
但是如果你需要对非用户的人建模呢? - JoshBerke
最好有另一个名称,即使不完美(可读性:成员),也比每次忘记引用用户时都受到打击要好。 - Christos Hayward
1
你应该始终引用每个表和列的名称。一旦开始这样做,就很容易了。 - rjmunro
在SQL:2003中,MEMBER是保留字! - Clint Pachl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接