【问题标题】:Inline index definition fails when name is the same as table name当名称与表名相同时,内联索引定义失败
【发布时间】:2019-06-04 17:53:03
【问题描述】:

SQL Server 对象(即表和索引)有自己的命名空间。因此索引和表可以具有相同的名称(但这不是常见/良好的做法):

CREATE TABLE t(id INT PRIMARY KEY, col INT);
CREATE INDEX t ON t(col);

SELECT * FROM sys.tables WHERE name = 't';
SELECT * FROM sys.indexes WHERE name = 't';

db<>fiddle demo

很遗憾,我无法使用 inline index definition 创建相同的构造:

CREATE TABLE t(id INT PRIMARY KEY, col INT, INDEX t(col));

消息 2714 级别 16 状态 5 第 1 行

数据库中已经有一个名为“t”的对象。

-- below code is working correctly
CREATE TABLE t(id INT PRIMARY KEY, col INT, INDEX t1(col));

db<>fiddle demo 2

我错过了一些明显的东西还是一个错误?

【问题讨论】:

  • 。 .这似乎是一个错误。当然,我倾向于将索引命名为“idx__”。这使得使用索引名称更容易理解消息。
  • @GordonLinoff 是的,我同意正确的命名约定至关重要。我只是好奇为什么单独的语句可以,而内联版本以错误结尾。我也认为这是一个错误,但首先我想排除最明显的原因:)
  • 您的数据库是什么版本?尽管我同意这不是一个好的命名约定,但它在我的 2014 实例上没有任何问题。我没有任何更新的现成可用。
  • @SeanLange demo SQL Server 2014 现在我很确定这是一个错误 :)
  • 这很奇怪。在 2014 年工作,但在 2017 年失败......对我来说似乎是一个错误。

标签: sql sql-server tsql create-table sql-server-2017


【解决方案1】:

我错过了一些明显的东西还是一个错误?

看起来像一个错误。

CREATE TABLE t(id INT PRIMARY KEY, col INT, INDEX t(col));

输出

Microsoft SQL Server 2017 (RTM-GDR) (KB4293803) - 14.0.2002.14 (X64) 
    Jul 21 2018 07:47:45 
    Copyright (C) 2017 Microsoft Corporation
    Developer Edition (64-bit) on Windows 10 Enterprise 10.0 <X64> (Build 17763: ) (Hypervisor)


(1 row affected)

Msg 2714, Level 16, State 5, Line 4
There is already an object named 't' in the database.
Msg 1750, Level 16, State 1, Line 4
Could not create constraint or index. See previous errors.

请在此处添加反馈项:https://feedback.azure.com/forums/908035-sql-server 特别注意这是 SQL 2016 中的回归。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多