SQL Server使用没有主键的聚簇索引创建表

时间:2011-11-30 21:14:23

标签: sql-server sql-server-2008 sql-server-2008-r2 azure-sql-database clustered-index

是否可以从SQL Server 2008中不是主键的create table语句创建聚簇索引?

这是针对SQL Azure中的表的,因此我不能首先创建表,然后在表上创建聚簇索引。

编辑:显然是FluentMigrator导致了我的问题,它的版本表没有聚集索引,因此尝试创建版本控制表而不是我的表是错误的。

3 个答案:

答案 0 :(得分:41)

是的,可以创建不是主键的聚簇索引。只需使用CREATE CLUSTERED INDEX语句。

CREATE TABLE dbo.myTable (
    myTableId int PRIMARY KEY NONCLUSTERED
    myColumn int NOT NULL
)

CREATE CLUSTERED INDEX myIndex ON dbo.myTable(myColumn)

在Azure SQL数据库v12版本之前,您必须先拥有聚簇索引,然后才能向表中插入任何数据。从Azure SQL Database v12开始,现在支持堆(没有聚簇索引的表)。

如果您的数据库是在2016年6月之前创建的,那么这里是instructions for upgrading to version 12

答案 1 :(得分:7)

CREATE TABLE dbo.Table_1
    (
    Id int NOT NULL IDENTITY (1, 1) PRIMARY KEY NONCLUSTERED,
    SomeOtherUniqueColumn int NOT NULL CONSTRAINT Item4 UNIQUE CLUSTERED
)  ON [PRIMARY]

注意主键上非聚集的规范

这仍然有效。

CREATE TABLE dbo.Table_1
    (
    SomeOtherUniqueColumn int NOT NULL CONSTRAINT Item4 UNIQUE CLUSTERED
)  ON [PRIMARY]

答案 2 :(得分:0)

以下代码与Azure兼容。它在单个create table语句中创建主键非聚簇和聚簇索引。此语法还允许在密钥中指定多个列。

CREATE TABLE MyTable (
    ID uniqueidentifier  NOT NULL,
    UserID uniqueidentifier  NOT NULL,
    EntryDate DATETIME NOT NULL,
    CONSTRAINT PK_MyPrimaryKey_Name PRIMARY KEY NONCLUSTERED (ID),
    CONSTRAINT UCI_MyClusteredIndexName UNIQUE CLUSTERED (UserID ASC,EntryDate ASC,ID ASC)
);

为了更改表聚簇索引,必须删除聚簇索引,这会将表转换为堆,然后应用新的聚簇索引。由于Azure不支持堆(没有聚簇索引的表),因此无法在不删除表并重新创建聚簇索引的情况下更改聚簇索引。在Azure中,除了表create statement之外的任何其他位置都不能指定聚簇索引。