是否可以从SQL Server 2008中不是主键的create table语句创建聚簇索引?
这是针对SQL Azure中的表的,因此我不能首先创建表,然后在表上创建聚簇索引。
编辑:显然是FluentMigrator导致了我的问题,它的版本表没有聚集索引,因此尝试创建版本控制表而不是我的表是错误的。
答案 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之外的任何其他位置都不能指定聚簇索引。