Clustered index con 2 campos

23/11/2006 - 20:37 por Gregorio López | Informe spam
Hola a todos. Tengo una tabla sobre la cual quiero crear un índice clustered
con 2 campos, el problema es que uno de los campos debe admitir valores
nulos (el otro campo tendría valores únicos lo que aseguraría la unicidad de
los valores para el índice), pero al parecer este detalle no permite la
creación del índice clustered. ¿Que me sugieren para poder hacer esto? Se me
ocurre tener un campo de tipo varchar el cual almacene los valores de ambos
campos concatenados, lo cual permitiría crear el índice, pero igual
supondría duplucidad en los datos.

Saludos.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
23/11/2006 - 22:58 | Informe spam
Gregorio,

Creo que falta algo aqui porque sql server si dejea crear un indice
clustered aunque la columna tenga valores nulos.

create table dbo.t1 (
c1 int not null identity unique,
c2 int
)

insert into dbo.t1 default values
insert into dbo.t1 default values

create unique clustered index ix_t1_c1_c2_u_c
on dbo.t1(c1, c2)

select * from dbo.t1

drop table dbo.t1

Lo que si no deja hacer sql server, y creo que la mayoria de sistemas de
bases de datos relacionales, es crear una clave primaria por columnas que
acepten valor null. Por definicion una clave primaria no puede contener
valores null. La forma en que sql server implementa fisicamente una clave
primaria es mediante el uso de un indice unico, que puede ser clustered o no
clustered. No importa el tipo de indice que se escoja para implementar la
clave primaria, esta no puede contener valores nulos. Si una de las columnas
contendra valores unicos, entonces puedes crear una restriccion de unnicidad
por ambas columnas, pero no una clave primaria.

create table dbo.t1 (
c1 int not null identity,
c2 int,
constraint uq_t1_c1_c2 unique (c1, c2)
)

insert into dbo.t1 default values
insert into dbo.t1 default values

select * from dbo.t1

drop table dbo.t1
go

Siempre es bueno que las tablas tengan indice clustered, asi que te tocara
hacer un analisis de tus columns y tipo de queries que usaras contra esa
tabla para escojer que columnas usar en el indice clustered. Si no encuentras
columnas candidatas, nunca esta de mas usar una clave subrrogada.

create table dbo.t1 (
c1 int not null identity primary key clustered,
c2 int not null,
c3 int,
constraint uq_t1_c2_c3 unique (c2, c3)
)

insert into dbo.t1 default values
insert into dbo.t1 default values

select * from dbo.t1

drop table dbo.t1
go


AMB

"Gregorio López" wrote:

Hola a todos. Tengo una tabla sobre la cual quiero crear un índice clustered
con 2 campos, el problema es que uno de los campos debe admitir valores
nulos (el otro campo tendría valores únicos lo que aseguraría la unicidad de
los valores para el índice), pero al parecer este detalle no permite la
creación del índice clustered. ¿Que me sugieren para poder hacer esto? Se me
ocurre tener un campo de tipo varchar el cual almacene los valores de ambos
campos concatenados, lo cual permitiría crear el índice, pero igual
supondría duplucidad en los datos.

Saludos.



Respuesta Responder a este mensaje
#2 Gregorio López
24/11/2006 - 20:19 | Informe spam
El problema era que intentaba crear un primary key clustered, con este es
que no se permite crearlo cuando uno de los campos permite valores nulos,
pero sí, ya vi que para un unique clustered index ahí no hay problema.

Al respecto, ¿que es mejor? ¿un primary key clustered o un unique clustered
index?

Saludos.

"Alejandro Mesa" wrote in message
news:
Gregorio,

Creo que falta algo aqui porque sql server si dejea crear un indice
clustered aunque la columna tenga valores nulos.

create table dbo.t1 (
c1 int not null identity unique,
c2 int
)

insert into dbo.t1 default values
insert into dbo.t1 default values

create unique clustered index ix_t1_c1_c2_u_c
on dbo.t1(c1, c2)

select * from dbo.t1

drop table dbo.t1

Lo que si no deja hacer sql server, y creo que la mayoria de sistemas de
bases de datos relacionales, es crear una clave primaria por columnas que
acepten valor null. Por definicion una clave primaria no puede contener
valores null. La forma en que sql server implementa fisicamente una clave
primaria es mediante el uso de un indice unico, que puede ser clustered o
no
clustered. No importa el tipo de indice que se escoja para implementar la
clave primaria, esta no puede contener valores nulos. Si una de las
columnas
contendra valores unicos, entonces puedes crear una restriccion de
unnicidad
por ambas columnas, pero no una clave primaria.

create table dbo.t1 (
c1 int not null identity,
c2 int,
constraint uq_t1_c1_c2 unique (c1, c2)
)

insert into dbo.t1 default values
insert into dbo.t1 default values

select * from dbo.t1

drop table dbo.t1
go

Siempre es bueno que las tablas tengan indice clustered, asi que te tocara
hacer un analisis de tus columns y tipo de queries que usaras contra esa
tabla para escojer que columnas usar en el indice clustered. Si no
encuentras
columnas candidatas, nunca esta de mas usar una clave subrrogada.

create table dbo.t1 (
c1 int not null identity primary key clustered,
c2 int not null,
c3 int,
constraint uq_t1_c2_c3 unique (c2, c3)
)

insert into dbo.t1 default values
insert into dbo.t1 default values

select * from dbo.t1

drop table dbo.t1
go


AMB

"Gregorio López" wrote:

Hola a todos. Tengo una tabla sobre la cual quiero crear un índice
clustered
con 2 campos, el problema es que uno de los campos debe admitir valores
nulos (el otro campo tendría valores únicos lo que aseguraría la unicidad
de
los valores para el índice), pero al parecer este detalle no permite la
creación del índice clustered. ¿Que me sugieren para poder hacer esto? Se
me
ocurre tener un campo de tipo varchar el cual almacene los valores de
ambos
campos concatenados, lo cual permitiría crear el índice, pero igual
supondría duplucidad en los datos.

Saludos.



Respuesta Responder a este mensaje
#3 Alejandro Mesa
25/11/2006 - 03:08 | Informe spam
Gregorio,

No existe un primary key clustered index, lo que pasa es que SQL Server usa
un indice unico para implementar una restriccion de clave primaria. El indice
puede ser clustered o nonclustered. La restriccion de clave primaria asume
que las columnas que forman la clave primaria no permiten valores nulos y
esto es por definicion.

create table dbo.t1 (
c1 int not null,
c2 int not null,
constraint pk_t1 primary key clustered (c1, c2)
)

create table dbo.t1 (
c1 int not null,
c2 int not null,
constraint uq_t1 unique clustered (c1, c2)
)

En el ejemplo anterior, ambos indices son unicos y clustered, ademas de que
su clave esta conformada por columnas que no aceptan valor nulo. Una
diferencia entre ambos tipos de restriccion es que en una tabla se pueden
crear multiples restricciones de unicidad, sin embargo solo se puede declarar
una sola restriccion de clave primaria.


AMB


"Gregorio López" wrote:

El problema era que intentaba crear un primary key clustered, con este es
que no se permite crearlo cuando uno de los campos permite valores nulos,
pero sí, ya vi que para un unique clustered index ahí no hay problema.

Al respecto, ¿que es mejor? ¿un primary key clustered o un unique clustered
index?

Saludos.

"Alejandro Mesa" wrote in message
news:
> Gregorio,
>
> Creo que falta algo aqui porque sql server si dejea crear un indice
> clustered aunque la columna tenga valores nulos.
>
> create table dbo.t1 (
> c1 int not null identity unique,
> c2 int
> )
>
> insert into dbo.t1 default values
> insert into dbo.t1 default values
>
> create unique clustered index ix_t1_c1_c2_u_c
> on dbo.t1(c1, c2)
>
> select * from dbo.t1
>
> drop table dbo.t1
>
> Lo que si no deja hacer sql server, y creo que la mayoria de sistemas de
> bases de datos relacionales, es crear una clave primaria por columnas que
> acepten valor null. Por definicion una clave primaria no puede contener
> valores null. La forma en que sql server implementa fisicamente una clave
> primaria es mediante el uso de un indice unico, que puede ser clustered o
> no
> clustered. No importa el tipo de indice que se escoja para implementar la
> clave primaria, esta no puede contener valores nulos. Si una de las
> columnas
> contendra valores unicos, entonces puedes crear una restriccion de
> unnicidad
> por ambas columnas, pero no una clave primaria.
>
> create table dbo.t1 (
> c1 int not null identity,
> c2 int,
> constraint uq_t1_c1_c2 unique (c1, c2)
> )
>
> insert into dbo.t1 default values
> insert into dbo.t1 default values
>
> select * from dbo.t1
>
> drop table dbo.t1
> go
>
> Siempre es bueno que las tablas tengan indice clustered, asi que te tocara
> hacer un analisis de tus columns y tipo de queries que usaras contra esa
> tabla para escojer que columnas usar en el indice clustered. Si no
> encuentras
> columnas candidatas, nunca esta de mas usar una clave subrrogada.
>
> create table dbo.t1 (
> c1 int not null identity primary key clustered,
> c2 int not null,
> c3 int,
> constraint uq_t1_c2_c3 unique (c2, c3)
> )
>
> insert into dbo.t1 default values
> insert into dbo.t1 default values
>
> select * from dbo.t1
>
> drop table dbo.t1
> go
>
>
> AMB
>
> "Gregorio López" wrote:
>
>> Hola a todos. Tengo una tabla sobre la cual quiero crear un índice
>> clustered
>> con 2 campos, el problema es que uno de los campos debe admitir valores
>> nulos (el otro campo tendría valores únicos lo que aseguraría la unicidad
>> de
>> los valores para el índice), pero al parecer este detalle no permite la
>> creación del índice clustered. ¿Que me sugieren para poder hacer esto? Se
>> me
>> ocurre tener un campo de tipo varchar el cual almacene los valores de
>> ambos
>> campos concatenados, lo cual permitiría crear el índice, pero igual
>> supondría duplucidad en los datos.
>>
>> Saludos.
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida