SQL Server создает таблицу с кластерным индексом без первичного ключа - PullRequest
17 голосов
/ 01 декабря 2011

Можно ли создать кластерный индекс из оператора создания таблицы в SQL Server 2008, который не является первичным ключом?

Цель этого - для таблицы в SQL Azure, поэтому я не могу сначала создать таблицу, а затем создать кластеризованный индекс для таблицы.

Редактировать: Очевидно, что именно FluentMigrator вызывал мои проблемы, его таблица версий не имеет кластеризованного индекса, поэтому он пытался создать таблицу версий, а не мою таблицу.

Ответы [ 3 ]

41 голосов
/ 01 декабря 2011

Да, можно создать кластерный индекс, который не является первичным ключом. Просто используйте оператор 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 Database v12 вам нужно было иметь кластеризованный индекс, прежде чем вы могли вставить какие-либо данные в таблицу. Начиная с База данных SQL Azure v12 , теперь поддерживаются кучи (таблицы без кластерного индекса).

Если ваша база данных была создана до июня 2016 года, вот инструкции по обновлению до версии 12 .

7 голосов
/ 01 декабря 2011
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]
0 голосов
/ 27 сентября 2016

Код ниже совместим с Azure.Он создает первичный ключ без кластеризации и кластеризованный индекс в одном операторе создания таблицы.Этот синтаксис также позволяет указывать более одного столбца в вашем ключе.

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 нельзя указывать кластеризованный индекс в любом другом месте, кроме оператора создания таблицы.

...