Indice unico con filtro

05/08/2006 - 06:58 por Carlos | Informe spam
Como puedo crear un indice unico pero solo para un subconjunto de datos
basandome en los valores de una columna.

Ej.

col1, col2

Yo quiero crear un indice unico para col2 pero que solo me tome los
registros que tienen col1=1 or col1=3 . Seria algo como un indice unico pero
con un filtro.


Se puede ?

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
05/08/2006 - 17:54 | Informe spam
Carlos,

Puedes crear una vista donde col1 in (1, 3) y luego crear un indice unico
por col2.

create view dbo.v1
with schemabinding
as
select col2
from dbo.t1
where col1 in (1, 3)
go

create unique clustered index v1_col2_u_c_ix
on dbo.v1(col2)
go

insert into dbo.t1(col1, col2) values(1, 1)
go

insert into dbo.t1(col1, col2) values(3, 1)
go

ambien puedes crear una columna calculada y usar esta junto col2 para
definir una restriccion de unicidad. Este metodo funciona si tienes una clave
primaria que no sea multi-columnas. Supongamos que tienes:

create table dbo.t1 (
pk int not null identity primary key,
col1 int not null,
col2 int not null,
col3 as case when col1 in (1, 3) then 0 else pk end,
constraint uq_t1_col2_col3 unique (col2, col3)
)
go

insert into dbo.t1(col1, col2) values(1, 1)
insert into dbo.t1(col1, col2) values(2, 1)
insert into dbo.t1(col1, col2) values(4, 1)
go

select * from dbo.t1
go

insert into dbo.t1(col1, col2) values(3, 1)
go


AMB

"Carlos" wrote:

Como puedo crear un indice unico pero solo para un subconjunto de datos
basandome en los valores de una columna.

Ej.

col1, col2

Yo quiero crear un indice unico para col2 pero que solo me tome los
registros que tienen col1=1 or col1=3 . Seria algo como un indice unico pero
con un filtro.


Se puede ?



Respuesta Responder a este mensaje
#2 Pedro Echavarria
05/08/2006 - 18:51 | Informe spam

ambien puedes crear una columna calculada y usar esta junto col2 para
definir una restriccion de unicidad. Este metodo funciona si tienes una
clave
primaria que no sea multi-columnas. Supongamos que tienes:




Leyendo esa interesante idea me surgen estas preguntas, amigo Alejandro:

1) Si uno en vez de poner "then 0" pone la misma columna en cuestion (ej:
col3 as case when col1 in (1, 3) then col1 else pk end ), no se obtendria la
misma utilidad? E incluso la restriccion podria dejarse para solo la
columna calculada col3 ej: constraint uq_t1_coll3 unique (col3). Es asi o
lo he interpretado mal ?

2) En el caso de que la pk sea multicolumnas y sus columnas sean
alfanumericas, ciertamente se podria usar el mismo criterio concatenando la
pk en
una sola expresion ? ej. case when col1 in (1,3) then '0' else
pkcol1+pkcol2 end.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
06/08/2006 - 00:44 | Informe spam
Pedro,

Interesantes tus preguntas. Veamos que pasa con ejemplos practicos.

1) Si uno en vez de poner "then 0" pone la misma columna en cuestion (ej:
col3 as case when col1 in (1, 3) then col1 else pk end ), no se obtendria la
misma utilidad? E incluso la restriccion podria dejarse para solo la
columna calculada col3 ej: constraint uq_t1_coll3 unique (col3). Es asi o
lo he interpretado mal ?



Como la condicion de la columna [col1] involucra mas de un valor, entonces
podemos correr el riesgo de tener esta combinacion:

col1 = 1, col2 = 1, col3 = 1
col1 = 3, col2 = 1, col3 = 3

como puedes ver, el valor de [col2] se repite, sin embargo el valor de
[col3] son diferentes y por lo tanto la restriccion de unicidad por ambas
columnas no falla. Si usamos cualquier constante, digamos 0, entonces
quedaria:

col1 = 1, col2 = 1, col3 = 0
col1 = 3, col2 = 1, col3 = 0

y aqui la restriccion de unicidad por ([col2], [col3]) dara error.

2) En el caso de que la pk sea multicolumnas y sus columnas sean
alfanumericas, ciertamente se podria usar el mismo criterio concatenando la
pk en
una sola expresion ? ej. case when col1 in (1,3) then '0' else
pkcol1+pkcol2 end.



La concatenacion puede dar como resultado valores iguales para diferentes
combinaciones.

pk1 = 'micro', pk2 = 'soft', col1 = 2, col2 = 1, col3 = 'microsoft'
pk1 = 'micr', pk2 = 'osoft', col1 = 4, col2 = 1, col3 = 'microsoft'

a pesar de que la restriccion de clave primaria es unica a nivel de
multi-columnas, la concatenacion no lo es.y por tanto ([col2], [col3]) no lo
es apesar de que [col1] no es 1 o 3.


AMB


"Pedro Echavarria" wrote:

>
> ambien puedes crear una columna calculada y usar esta junto col2 para
> definir una restriccion de unicidad. Este metodo funciona si tienes una
> clave
> primaria que no sea multi-columnas. Supongamos que tienes:
>

Leyendo esa interesante idea me surgen estas preguntas, amigo Alejandro:

1) Si uno en vez de poner "then 0" pone la misma columna en cuestion (ej:
col3 as case when col1 in (1, 3) then col1 else pk end ), no se obtendria la
misma utilidad? E incluso la restriccion podria dejarse para solo la
columna calculada col3 ej: constraint uq_t1_coll3 unique (col3). Es asi o
lo he interpretado mal ?

2) En el caso de que la pk sea multicolumnas y sus columnas sean
alfanumericas, ciertamente se podria usar el mismo criterio concatenando la
pk en
una sola expresion ? ej. case when col1 in (1,3) then '0' else
pkcol1+pkcol2 end.






Respuesta Responder a este mensaje
#4 Ricardo Passians
06/08/2006 - 02:09 | Informe spam
Hola Alejandro:

1) Si uno en vez de poner "then 0" pone la misma columna en cuestion (ej:



como puedes ver, el valor de [col2] se repite, sin embargo el valor de
[col3] son diferentes y por lo tanto la restriccion de unicidad por ambas
columnas no falla. Si usamos cualquier constante, digamos 0, entonces
quedaria:

col1 = 1, col2 = 1, col3 = 0
col1 = 3, col2 = 1, col3 = 0

y aqui la restriccion de unicidad por ([col2], [col3]) dara error.




Yo creo que si hay algo de razon en lo que dice Pedro pero redefiniendo la
tabla y la columna calculada (col2 en vez de col1). Como la que no se debe
repetir es col2 para col1 in (1,3) puede simplificarse asi:

create table dbo.t1 (
pk int not null identity primary key,
col1 int not null,
col2 int not null,
col3 as case when col1 in (1, 3) then col2 else pk end,
constraint uq_t1_col3 unique (col3)
)



2) En el caso de que la pk sea multicolumnas y sus columnas sean



La concatenacion puede dar como resultado valores iguales para diferentes
combinaciones.

pk1 = 'micro', pk2 = 'soft', col1 = 2, col2 = 1, col3 = 'microsoft'
pk1 = 'micr', pk2 = 'osoft', col1 = 4, col2 = 1, col3 = 'microsoft'

a pesar de que la restriccion de clave primaria es unica a nivel de
multi-columnas, la concatenacion no lo es.y por tanto ([col2], [col3]) no
lo
es apesar de que [col1] no es 1 o 3.





De acuerdo. Pero podria usarse cuando las columnas que componen la PK no
sean tipo VARCHAR(), sino tipo CHAR(), esto es que se autocompleten con
espacios en blanco y como una doble seguridad se puese usar un separador
constante por ejemplo: "columna1+'-'+columna2". La idea es que la
concatenacion tenga una estructura fija.
Respuesta Responder a este mensaje
#5 Tito
07/08/2006 - 04:15 | Informe spam
Que interesante esta eso!
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida