Unique Constraint y valores nulls

27/07/2006 - 16:24 por Alfredo Crisostomo | Informe spam
Hola todos.

Me interesa crear una restriccion en una tabla que me impida tener un valor
repetido en una columna pero solo cuando el valor no sea null. O sea que
permita tener valores nulls (en distintos registros) pero que los que no
sean null no se repitan.

Como se podria definir eso de manera declarativa ?

muchas gracias.

Preguntas similare

Leer las respuestas

#1 GenioMaestro
27/07/2006 - 16:55 | Informe spam
Por declarativa creo que no se puede. Si el indice es unico, es unico, es
decir no se puede repetir ningun valor, nisiquiera NULL.

Tendrás que hacerlo con un triger, de la forma

IF (SELECT campo FROM tabla WHERE clave = nuevaclave) <> null THEN RETURN
ERROR

o algo asi.



"Alfredo Crisostomo" escribió en el mensaje
news:
Hola todos.

Me interesa crear una restriccion en una tabla que me impida tener un
valor repetido en una columna pero solo cuando el valor no sea null. O
sea que permita tener valores nulls (en distintos registros) pero que los
que no sean null no se repitan.

Como se podria definir eso de manera declarativa ?

muchas gracias.

Respuesta Responder a este mensaje
#2 Alejandro Mesa
27/07/2006 - 17:47 | Informe spam
Alfredo,

1 - Crear una vista indexada sobre los valores no nulos
2 - Crear una columna calculada que tome el valor de la clave primaria
cuando el valor es null y una constante cuando no lo es. Declarar una
restriccion "unique" sobre la combinacion de columnas (columna_en_question,
columna_calculada) (mi preferida).

Ejemplos:

create table dbo.t1 (
c1 int not null identity(1, 1) primary key,
c2 int null,
)
go

create view dbo.v1
with schemabinding
as
select c1, c2
from dbo.t1
where c2 is not null
go

create unique clustered index v1_c1_u_c_ix
on dbo.v1(c2 asc)
go

insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
go

insert into dbo.t1(c2) values(1)
insert into dbo.t1(c2) values(2)
insert into dbo.t1(c2) values(3)
go

insert into dbo.t1(c2) values(3)
go

drop view dbo.v1
go

truncate table dbo.t1
go

alter table dbo.t1
add c3 as case when c2 is null then c1 else 0 end
go

alter table dbo.t1
add constraint uq_t1_c1_c3 unique(c2, c3)
go

insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
go

insert into dbo.t1(c2) values(1)
insert into dbo.t1(c2) values(2)
insert into dbo.t1(c2) values(3)
go

insert into dbo.t1(c2) values(3)
go

select * from dbo.t1
go

drop table dbo.t1
go


AMB


"Alfredo Crisostomo" wrote:

Hola todos.

Me interesa crear una restriccion en una tabla que me impida tener un valor
repetido en una columna pero solo cuando el valor no sea null. O sea que
permita tener valores nulls (en distintos registros) pero que los que no
sean null no se repitan.

Como se podria definir eso de manera declarativa ?

muchas gracias.



Respuesta Responder a este mensaje
#3 Alfredo Crisostomo
27/07/2006 - 21:25 | Informe spam
Me ire por la segunda opcion pues me parece excelente!!!

Mil gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Alfredo,

1 - Crear una vista indexada sobre los valores no nulos
2 - Crear una columna calculada que tome el valor de la clave primaria
cuando el valor es null y una constante cuando no lo es. Declarar una
restriccion "unique" sobre la combinacion de columnas
(columna_en_question,
columna_calculada) (mi preferida).

Ejemplos:

create table dbo.t1 (
c1 int not null identity(1, 1) primary key,
c2 int null,
)
go

create view dbo.v1
with schemabinding
as
select c1, c2
from dbo.t1
where c2 is not null
go

create unique clustered index v1_c1_u_c_ix
on dbo.v1(c2 asc)
go

insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
go

insert into dbo.t1(c2) values(1)
insert into dbo.t1(c2) values(2)
insert into dbo.t1(c2) values(3)
go

insert into dbo.t1(c2) values(3)
go

drop view dbo.v1
go

truncate table dbo.t1
go

alter table dbo.t1
add c3 as case when c2 is null then c1 else 0 end
go

alter table dbo.t1
add constraint uq_t1_c1_c3 unique(c2, c3)
go

insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
go

insert into dbo.t1(c2) values(1)
insert into dbo.t1(c2) values(2)
insert into dbo.t1(c2) values(3)
go

insert into dbo.t1(c2) values(3)
go

select * from dbo.t1
go

drop table dbo.t1
go


AMB


"Alfredo Crisostomo" wrote:

Hola todos.

Me interesa crear una restriccion en una tabla que me impida tener un
valor
repetido en una columna pero solo cuando el valor no sea null. O sea que
permita tener valores nulls (en distintos registros) pero que los que no
sean null no se repitan.

Como se podria definir eso de manera declarativa ?

muchas gracias.



Respuesta Responder a este mensaje
#4 GenioMaestro
27/07/2006 - 21:49 | Informe spam
Cierto, usando todas las posibilidades de sql. Muy bueno.


"Alfredo Crisostomo" escribió en el mensaje
news:%23%
Me ire por la segunda opcion pues me parece excelente!!!

Mil gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Alfredo,

1 - Crear una vista indexada sobre los valores no nulos
2 - Crear una columna calculada que tome el valor de la clave primaria
cuando el valor es null y una constante cuando no lo es. Declarar una
restriccion "unique" sobre la combinacion de columnas
(columna_en_question,
columna_calculada) (mi preferida).

Ejemplos:

create table dbo.t1 (
c1 int not null identity(1, 1) primary key,
c2 int null,
)
go

create view dbo.v1
with schemabinding
as
select c1, c2
from dbo.t1
where c2 is not null
go

create unique clustered index v1_c1_u_c_ix
on dbo.v1(c2 asc)
go

insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
go

insert into dbo.t1(c2) values(1)
insert into dbo.t1(c2) values(2)
insert into dbo.t1(c2) values(3)
go

insert into dbo.t1(c2) values(3)
go

drop view dbo.v1
go

truncate table dbo.t1
go

alter table dbo.t1
add c3 as case when c2 is null then c1 else 0 end
go

alter table dbo.t1
add constraint uq_t1_c1_c3 unique(c2, c3)
go

insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
insert into dbo.t1(c2) values(null)
go

insert into dbo.t1(c2) values(1)
insert into dbo.t1(c2) values(2)
insert into dbo.t1(c2) values(3)
go

insert into dbo.t1(c2) values(3)
go

select * from dbo.t1
go

drop table dbo.t1
go


AMB


"Alfredo Crisostomo" wrote:

Hola todos.

Me interesa crear una restriccion en una tabla que me impida tener un
valor
repetido en una columna pero solo cuando el valor no sea null. O sea
que
permita tener valores nulls (en distintos registros) pero que los que no
sean null no se repitan.

Como se podria definir eso de manera declarativa ?

muchas gracias.









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