【问题标题】:Is it possible non-Clustered Index while creating Table?创建表时是否可以使用非聚集索引?
【发布时间】:2017-12-29 19:17:48
【问题描述】:
create table tblPeople 
(
     sno int  primary key ,  
     Name nvarchar(50), 
     Gender nvarchar(10) , 
     Age int ,
     index IX_tblPeople_Age nonclustered(age)
) 

执行上述操作时出现错误。

“索引”附近的语法不正确。如果打算将其作为表提示的一部分,则现在需要 WITH 关键字和括号。有关正确的语法,请参阅 SQL Server 联机丛书。

【问题讨论】:

  • 什么版本的 SQL Server? 2016 年适用于我。微软声明它适用于 2014 年及更高版本。
  • 它在 2012 年对我不起作用,docs.microsoft.com/en-us/sql/t-sql/statements/… 的一个例子也不起作用 CREATE TABLE t4( c1 int, c2 int, INDEX ix_1 NONCLUSTERED (c1,c2)) 同样的错误消息。
  • 根据this,此语法应从 SQL Server 2014 版开始工作

标签: sql sql-server


【解决方案1】:

您可以使用传统的在表之后创建索引的语法吗?

CREATE TABLE tblPeople (
     sno int  primary key ,  
     Name nvarchar(50), 
     Gender nvarchar(10) , 
     Age int
) 
CREATE NONCLUSTERED INDEX IX_tblPeople_Age ON tblPeople (age); 

【讨论】:

  • 非常感谢.. 但是括号内是否有任何可能的查询?
【解决方案2】:

根据CREATE TABLE documentation,此语法适用于 2014 版本的 SQL Server 及更高版本。您可以在文章中找到以下信息:

INDEX *index_name* [ CLUSTERED | NONCLUSTERED ] (*column_name* [ ASC | DESC ] [ ,... *n* ] )

适用于:SQL Server 2014 到 SQL Server 2017 和 Azure SQL 数据库。

指定在表上创建索引。这可以是一个集群 索引或非聚集索引。索引将包含列 列出,并将按升序或降序对数据进行排序 顺序。

因此,如果您的版本早于 2014 年,我建议使用以下语法:

CREATE TABLE tblPeople (
 sno int  primary key ,  
 Name nvarchar(50), 
 Gender nvarchar(10) , 
 Age int
) 
GO
CREATE NONCLUSTERED INDEX IX_tblPeople_Age ON tblPeople (age); 

【讨论】:

    【解决方案3】:

    您可以使用与 2008 兼容的内联语法来获得相同的结果

    create table tblPeople 
    (
         sno int  primary key ,  
         Name nvarchar(50), 
         Gender nvarchar(10) , 
         Age int ,
         Constraint IX_tblPeople_Age unique nonclustered(age, sno)
    ) 
    

    因为sno 将是 CI 键,并且 SQL Server 总是将聚集键添加到在具有聚集索引的表上创建的非唯一非聚集索引的键中。

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2013-05-20
      • 2017-05-08
      • 2011-08-21
      • 2013-10-04
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多