É possível criar uma chave primária ou índice exclusivo em uma instrução CREATE TABLE do SQL Server. É possível criar um índice não exclusivo em uma instrução 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
Novamente, o objetivo é criar o índice não exclusivo dentro da instrução CREATE TABLE, não depois dele.
Pelo que vale a pena, não achei a [entrada do SQL Server Books Online para CREATE TABLE] útil.
Além disso, [esta pergunta] é quase idêntica, mas a resposta aceita não se aplica.
fonte
Error: (1146) Table 'tablename' doesn't exist
, hahahah, irônicoDe acordo com a documentação CREATE TABLE do T-SQL , em 2014 a definição da coluna suporta a definição de um índice:
e a gramática é definida como:
Portanto, muito do que você pode fazer como uma instrução separada pode ser feito inline. Percebi que
include
não é uma opção nesta gramática, então algumas coisas não são possíveis.Você também pode ter índices inline definidos como outra linha após as colunas, mas dentro da instrução create table, e isso permite várias colunas no índice, mas ainda nenhuma
include
cláusula:Por exemplo, aqui adicionamos um índice em ambas as colunas c e d:
fonte
É uma declaração separada.
Também não é possível inserir em uma tabela e selecionar a partir dela e construir um índice na mesma instrução.
A entrada BOL contém as informações de que você precisa:
Você pode criar um índice em um campo PK, mas não um índice não clusterizado em um campo não restrito não exclusivo não PK.
Um índice NCL não é relevante para a estrutura da tabela e não é uma restrição aos dados dentro da tabela. É uma entidade separada que suporta a tabela, mas não é parte integrante de sua funcionalidade ou design.
É por isso que é uma declaração separada. O índice NCL é irrelevante para a tabela do ponto de vista do projeto (apesar da otimização da consulta).
fonte
A resposta aceita de como criar um índice embutido em um script de criação de tabela não funcionou para mim. Isso fez:
Lembre-se de que as chaves estrangeiras não criam índices, portanto, é uma boa prática indexá-los, pois é mais do que provável que você se junte a eles.
fonte