Создание некластеризованного неуникального индекса в инструкции CREATE TABLE с помощью SQL Server



можно создать первичный ключ или уникальный индекс в инструкции SQL Server CREATE TABLE. Можно ли создать неуникальный индекс в инструкции CREATE TABLE?



CREATE TABLE MyTable(
a int NOT NULL
,b smallint NOT NULL
,c smallint NOT NULL
,d smallint NOT NULL
,e smallint NOT NULL

-- This creates a primary key
,CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (a)

-- This creates a unique nonclustered index on columns b and c
,CONSTRAINT IX_MyTable1 UNIQUE (b, c)

-- Is it possible to create a non-unique index on columns d and e here?
-- Note: these variations would not work if attempted:
-- ,CONSTRAINT IX_MyTable2 INDEX (d, e)
-- ,CONSTRAINT IX_MyTable3 NONCLUSTERED INDEX (d, e)
);
GO

-- The proposed non-unique index should behave identically to
-- an index created after the CREATE TABLE statement. Example:
CREATE NONCLUSTERED INDEX IX_MyTable4 ON MY_TABLE (d, e);
GO


опять же, цель состоит в том, чтобы создать неуникальный индекс в инструкции CREATE TABLE, а не после него.



для чего это стоит, я не нашел [электронная запись SQL Server для создания таблицы] чтобы быть полезным.



также, [Этот Вопрос] почти идентичен, но принятый ответ не применяется.

631   4  

4 ответов:

вы не можете. Создание / изменение таблицы принимают только ограничения для добавления, а не индексы. Тот факт, что первичный ключ и уникальные ограничения реализуются в терминах индекса, является побочным эффектом. Чтобы управлять индексами, вы должны создать/изменить / удалить индекс, как вы хорошо знаете.

почему у вас есть такое требование, чтобы добавить неуникальные некластеризованные индексы в инструкцию CREATE TABLE?

обратите внимание, что SQL Server 2014 представил встроенный индекс создать вариант:

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    -- This creates a primary key
    ,CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (a)

    -- This creates a unique nonclustered index on columns b and c
    ,CONSTRAINT IX_MyTable1 UNIQUE (b, c)

    -- This creates a non-clustered index on (d, e)
    ,INDEX IX_MyTable4 NONCLUSTERED (d, e)
);
GO

Это отдельное заявление.

также невозможно вставить в таблицу и выбрать из нее и построить индекс в том же операторе.

запись BOL содержит необходимую информацию:

КЛАСТЕРНЫЙ / НЕКЛАСТЕРИЗОВАННЫЙ
Свидетельствовать о том кластеризованный или некластеризованный индекс созданный для первичного ключа или уникальный ограничение. ограничение Primary key по умолчанию-кластерный и уникальный ограничений по умолчанию Некластеризованный.

в инструкции CREATE TABLE, КЛАСТЕРИЗОВАННОЙ может быть указан только для одного ограничение. Если кластеризованный указан для уникального ограничения и первичного Ключевое ограничение также определено, Первичный ключ по умолчанию некластеризованный.

вы можете создать индекс в поле PK, но не некластеризованный индекс в поле без ограничения уникальности pk.

индекс NCL не имеет отношения к структуре таблицы и не является ограничение на данные внутри таблицы. Это отдельная сущность, которая поддерживает таблицу, но не является неотъемлемой частью ее функциональности или дизайна.

вот почему это отдельное заявление. Индекс NCL не имеет отношения к таблице с точки зрения проектирования (несмотря на оптимизацию запросов).

принятый ответ о том, как создать индекс встроенный скрипт создания таблицы не работал для меня. Это сделал:

CREATE TABLE [dbo].[TableToBeCreated]
(
    [Id] BIGINT IDENTITY(1, 1) NOT NULL PRIMARY KEY
    ,[ForeignKeyId] BIGINT NOT NULL
    ,CONSTRAINT [FK_TableToBeCreated_ForeignKeyId_OtherTable_Id] FOREIGN KEY ([ForeignKeyId]) REFERENCES [dbo].[OtherTable]([Id])
    ,INDEX [IX_TableToBeCreated_ForeignKeyId] NONCLUSTERED ([ForeignKeyId])
)

помните, что внешние ключи не создают индексы, поэтому рекомендуется индексировать их, поскольку вы, скорее всего, присоединитесь к ним.

по состоянию на T-SQL СОЗДАТЬ ТАБЛИЦУ документация, в 2014 году определение столбца поддерживает определение индекса:

<column_definition> ::=  
column_name <data_type>  
    ...
    [ <column_index> ]  

и грамматика определяется как:

<column_index> ::=   
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]  
    [ WITH ( <index_option> [ ,... n ] ) ]  
    [ ON { partition_scheme_name (column_name )   
         | filegroup_name  
         | default   
         }  
    ]   
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]  

поэтому многое из того, что вы можете сделать в качестве отдельного оператора, можно сделать встроенным. Я заметил include не является опцией в этой грамматике, поэтому некоторые вещи невозможны.

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL index IX_MyTable_b nonclustered
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL
)

вы также можете иметь встроенные индексы, определенные как другая строка после столбцов, но в таблице create оператор, и это позволяет несколько столбцов в индексе, но все равно нет include статья:

< table_index > ::=   
{  
    {  
      INDEX index_name [ CLUSTERED | NONCLUSTERED ]   
         (column_name [ ASC | DESC ] [ ,... n ] )   
    | INDEX index_name CLUSTERED COLUMNSTORE  
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE (column_name [ ,... n ] )  
    }  
    [ WITH ( <index_option> [ ,... n ] ) ]   
    [ ON { partition_scheme_name (column_name )   
         | filegroup_name  
         | default   
         }  
    ]   
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]  

}   

например, здесь мы добавляем индекс для обоих столбцов c и d:

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL index IX_MyTable_b nonclustered
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    ,index IX_MyTable_c_d nonclustered (c,d)
)

Comments

    Ничего не найдено.