当名称与表名相同时,内联索引定义失败

Posted

技术标签:

【中文标题】当名称与表名相同时,内联索引定义失败【英文标题】: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 年失败......对我来说似乎是一个错误。 【参考方案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 中的回归。

【讨论】:

从一开始就是我的意图,但首先我总是征求意见。我将创建一个案例并链接到这个问题。谢谢:) 供以后参考:feedback.azure.com/forums/908035-sql-server/suggestions/…

以上是关于当名称与表名相同时,内联索引定义失败的主要内容,如果未能解决你的问题,请参考以下文章

在文件名与表名不同的地方使用 mysqlimport

数据库索引

mysql 远程登录与表名大小写问题

mysql的索引,事务,引擎

表字段与表结构的操作区别

MYSQL批量修改表前缀与表名sql语句