Saltar al contenido

Cree un índice no único no agrupado dentro de la declaración CREATE TABLE con SQL Server

Te sugerimos que pruebes esta solución en un ambiente controlado antes de enviarlo a producción, un saludo.

Solución:

A partir de SQL 2014, esto se puede lograr mediante la creación de índices en línea:

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 standard non-clustered index on (d, e)
    ,INDEX IX_MyTable4 NONCLUSTERED (d, e)
);
GO

Antes de SQL 2014, CREATE/ALTER TABLE solo aceptaba RESTRICCIONES para agregar, no índices. El hecho de que la primaria key y las restricciones únicas se implementan en términos de un índice es un efecto secundario.

TLDR:

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

Detalles

Según la documentación de T-SQL CREATE TABLE, en 2014 la definición de columna admite la definición de un índice:

 ::=  
column_name   
    ...
    [  ]  

y La gramática se define como:

 ::=   
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]  
    [ WITH (  [ ,... n ] ) ]  
    [ ON  partition_scheme_name (column_name )   
           
    ]   
    [ FILESTREAM_ON  "NULL"  ]  
  

Entonces, mucho de lo que puede hacer como una declaración separada se puede hacer en línea. Me di cuenta include no es una opción en esta gramática por lo que algunas cosas no son posibles.

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

También puede tener índices en línea definidos como otra línea después de las columnas, pero dentro de la declaración de creación de tabla, y esto permite múltiples columnas en el índice, pero aún no include cláusula:

< table_index > ::=   
  
     DESC ] [ ,... n ] )   
      
    [ WITH (  [ ,... n ] ) ]   
    [ ON  partition_scheme_name (column_name )   
           
    ]   
    [ FILESTREAM_ON  partition_scheme_name  ]  
  
   

Por ejemplo, aquí agregamos un índice en ambas columnas c y 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)
)

Es una declaración aparte.

Tampoco es posible insertar en una tabla y seleccionar de ella y crear un índice en la misma declaración.

La entrada BOL contiene la información que necesita:

AGRUPADOS | NO AGRUPADO
Indica que se crea un índice agrupado o no agrupado para la restricción PRIMARY KEY o UNIQUE. Las restricciones PRIMARY KEY están predeterminadas en CLUSTERED y las restricciones UNIQUE están predeterminadas en NONCLUSTERED.

En una instrucción CREATE TABLE, CLUSTERED se puede especificar solo para una restricción. Si se especifica CLUSTERED para una restricción UNIQUE y también se especifica una restricción PRIMARY KEY, PRIMARY KEY se establece de forma predeterminada en NONCLUSTERED.

Puede crear un índice en un campo PK, pero no un índice no agrupado en un campo restringido no único no pk.

Un índice NCL no es relevante para la estructura de la tabla y no es una restricción para los datos dentro de la tabla. Es una entidad separada que soporta la mesa pero no es parte integral de su funcionalidad o diseño.

Es por eso que es una declaración separada. El índice NCL es irrelevante para la tabla desde una perspectiva de diseño (a pesar de la optimización de consultas).

Si guardas algún recelo y capacidad de renovar nuestro enunciado puedes realizar un comentario y con mucho gusto lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *