Indice único con NULL, pero repitiendo NULL

18/02/2008 - 13:23 por Paul | Informe spam
Hola,
Tengo una tabla con los campos Id, Nombe, NombreAux, IdNum. Donde
NombreAux permite NULOS.

Me gustaría crear un especie de índice único del siguiente tipo:
Indice --> NombreAux+IdNum

Pero que sólo se cumpliera se NombreAux es diferente de nulo

Ejemplo:
Id Nombre NombreAux IdNum
1 AAA AAA-AUX 100
2 BBB BBB-AUX 100
3 CCC NULL 100
4 DDD NULL 100

Al insertar el registro de Id=4 No me diera error.

Como lo hago?
Saludos

Preguntas similare

Leer las respuestas

#1 Rolando
18/02/2008 - 13:35 | Informe spam
Una forma es:

Ponle una clave primaria a la tabla (toda tabla debe tenerla aunque sea un
identity) y luego crea un campo calculado con esta expresion:

case when NombreAux is NULL then PK else NombreAux+IdNum end

Finalmente crea una restriccion Unique sobre el campo calculado.




"Paul" escribió en el mensaje
news:
Hola,
Tengo una tabla con los campos Id, Nombe, NombreAux, IdNum. Donde
NombreAux permite NULOS.

Me gustaría crear un especie de índice único del siguiente tipo:
Indice --> NombreAux+IdNum

Pero que sólo se cumpliera se NombreAux es diferente de nulo

Ejemplo:
Id Nombre NombreAux IdNum
1 AAA AAA-AUX 100
2 BBB BBB-AUX 100
3 CCC NULL 100
4 DDD NULL 100

Al insertar el registro de Id=4 No me diera error.

Como lo hago?
Saludos
Respuesta Responder a este mensaje
#2 Paul
18/02/2008 - 13:42 | Informe spam
On 18 Feb, 13:35, "Rolando" wrote:
Una forma es:

Ponle una clave primaria a la tabla (toda tabla debe tenerla aunque sea un
identity) y luego crea un campo calculado con esta expresion:

case when NombreAux is NULL then PK else NombreAux+IdNum end

Finalmente crea una restriccion Unique sobre el campo calculado.

"Paul" escribió en el mensajenews:
Hola,
Tengo una tabla con los campos Id, Nombe, NombreAux, IdNum. Donde
NombreAux permite NULOS.

Me gustaría crear un especie de índice único del siguiente tipo:
Indice --> NombreAux+IdNum

Pero que sólo se cumpliera se NombreAux es diferente de nulo

Ejemplo:
Id Nombre NombreAux IdNum
1 AAA AAA-AUX 100
2 BBB BBB-AUX 100
3 CCC NULL 100
4 DDD NULL 100

Al insertar el registro de Id=4 No me diera error.

Como lo hago?
Saludos



Hola,
La clave única que tengo es el campo 'Id', además tambien tengo un
índice unico que es 'Nombre'.
No entiendo lo de crear el campo calculado
Respuesta Responder a este mensaje
#3 Rolando
18/02/2008 - 14:02 | Informe spam
Pon la expresion del campo calculado asi entonces:

case when NombreAux is NULL then Id else NombreAux+IdNum end

Si son todas tipo char .. si son numericas usa CONVERT() para llevarlas a
char.

case when NombreAux is NULL then convert(char(10),Id) else
NombreAux+convert(char(10),IdNum) end

Si el campo calculado se llama por ejemplo CalcPK, luego creas un indice
unico sobre ese campo.


Es solo una idea para q lo implementes.




"Paul" escribió en el mensaje
news:
On 18 Feb, 13:35, "Rolando" wrote:
Una forma es:

Ponle una clave primaria a la tabla (toda tabla debe tenerla aunque sea un
identity) y luego crea un campo calculado con esta expresion:

case when NombreAux is NULL then PK else NombreAux+IdNum end

Finalmente crea una restriccion Unique sobre el campo calculado.

"Paul" escribió en el
mensajenews:
Hola,
Tengo una tabla con los campos Id, Nombe, NombreAux, IdNum. Donde
NombreAux permite NULOS.

Me gustaría crear un especie de índice único del siguiente tipo:
Indice --> NombreAux+IdNum

Pero que sólo se cumpliera se NombreAux es diferente de nulo

Ejemplo:
Id Nombre NombreAux IdNum
1 AAA AAA-AUX 100
2 BBB BBB-AUX 100
3 CCC NULL 100
4 DDD NULL 100

Al insertar el registro de Id=4 No me diera error.

Como lo hago?
Saludos



Hola,
La clave única que tengo es el campo 'Id', además tambien tengo un
índice unico que es 'Nombre'.
No entiendo lo de crear el campo calculado
Respuesta Responder a este mensaje
#4 Alejandro Mesa
18/02/2008 - 15:12 | Informe spam
Rolando,

La idea es correcta, pero no el valor de la columna calculada. Lo que se
trata de que sea unico es el valor de [NombreAux] y no de la expresion
[NombreAux] + [Id] pues esta expresion sera siempre diferente porque [Id] es
unico por definicion. La expresion a usar en este caso, suponiendo que [Id]
es [int], seria:

case when [NombreAux] is null ltrim([Id]) else [NombreAux] end


Ejemplo:

DECLARE @t TABLE (
c1 INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
c2 VARCHAR(25) NULL,
c3 AS CASE WHEN c2 IS NULL THEN LTRIM(c1) ELSE c2 END UNIQUE
)

INSERT INTO @t(c2) VALUES('SQL Server 2000')
INSERT INTO @t(c2) VALUES(NULL)
INSERT INTO @t(c2) VALUES('SQL Server 2005')
INSERT INTO @t(c2) VALUES(NULL)
INSERT INTO @t(c2) VALUES('SQL Server 2008')

SELECT * FROM @t

INSERT INTO @t(c2) VALUES('SQL Server 2000')
GO

En SQL Server 2008, Microsoft introdujo una nueva facilidad conocida como
"indices filtrados" (filtered indexes).

create unique nonclustered index t1_c2_u_nc_f_ix
on t1(c2)
where c2 is not null
GO


AMB


"Rolando" wrote:

Pon la expresion del campo calculado asi entonces:

case when NombreAux is NULL then Id else NombreAux+IdNum end

Si son todas tipo char .. si son numericas usa CONVERT() para llevarlas a
char.

case when NombreAux is NULL then convert(char(10),Id) else
NombreAux+convert(char(10),IdNum) end

Si el campo calculado se llama por ejemplo CalcPK, luego creas un indice
unico sobre ese campo.


Es solo una idea para q lo implementes.




"Paul" escribió en el mensaje
news:
On 18 Feb, 13:35, "Rolando" wrote:
> Una forma es:
>
> Ponle una clave primaria a la tabla (toda tabla debe tenerla aunque sea un
> identity) y luego crea un campo calculado con esta expresion:
>
> case when NombreAux is NULL then PK else NombreAux+IdNum end
>
> Finalmente crea una restriccion Unique sobre el campo calculado.
>
> "Paul" escribió en el
> mensajenews:
> Hola,
> Tengo una tabla con los campos Id, Nombe, NombreAux, IdNum. Donde
> NombreAux permite NULOS.
>
> Me gustaría crear un especie de índice único del siguiente tipo:
> Indice --> NombreAux+IdNum
>
> Pero que sólo se cumpliera se NombreAux es diferente de nulo
>
> Ejemplo:
> Id Nombre NombreAux IdNum
> 1 AAA AAA-AUX 100
> 2 BBB BBB-AUX 100
> 3 CCC NULL 100
> 4 DDD NULL 100
>
> Al insertar el registro de Id=4 No me diera error.
>
> Como lo hago?
> Saludos

Hola,
La clave única que tengo es el campo 'Id', además tambien tengo un
índice unico que es 'Nombre'.
No entiendo lo de crear el campo calculado



Respuesta Responder a este mensaje
#5 Rolando
18/02/2008 - 21:39 | Informe spam
Es que segun lo que el escribió no era la suma de nombreaux+id sino
nombreaux+idnum. Donde idnum tambien se repite.

Al menos eso entendi :(

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

La idea es correcta, pero no el valor de la columna calculada. Lo que se
trata de que sea unico es el valor de [NombreAux] y no de la expresion
[NombreAux] + [Id] pues esta expresion sera siempre diferente porque [Id]
es
unico por definicion. La expresion a usar en este caso, suponiendo que
[Id]
es [int], seria:

case when [NombreAux] is null ltrim([Id]) else [NombreAux] end


Ejemplo:

DECLARE @t TABLE (
c1 INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
c2 VARCHAR(25) NULL,
c3 AS CASE WHEN c2 IS NULL THEN LTRIM(c1) ELSE c2 END UNIQUE
)

INSERT INTO @t(c2) VALUES('SQL Server 2000')
INSERT INTO @t(c2) VALUES(NULL)
INSERT INTO @t(c2) VALUES('SQL Server 2005')
INSERT INTO @t(c2) VALUES(NULL)
INSERT INTO @t(c2) VALUES('SQL Server 2008')

SELECT * FROM @t

INSERT INTO @t(c2) VALUES('SQL Server 2000')
GO

En SQL Server 2008, Microsoft introdujo una nueva facilidad conocida como
"indices filtrados" (filtered indexes).

create unique nonclustered index t1_c2_u_nc_f_ix
on t1(c2)
where c2 is not null
GO


AMB


"Rolando" wrote:

Pon la expresion del campo calculado asi entonces:

case when NombreAux is NULL then Id else NombreAux+IdNum end

Si son todas tipo char .. si son numericas usa CONVERT() para llevarlas
a
char.

case when NombreAux is NULL then convert(char(10),Id) else
NombreAux+convert(char(10),IdNum) end

Si el campo calculado se llama por ejemplo CalcPK, luego creas un indice
unico sobre ese campo.


Es solo una idea para q lo implementes.




"Paul" escribió en el mensaje
news:
On 18 Feb, 13:35, "Rolando" wrote:
> Una forma es:
>
> Ponle una clave primaria a la tabla (toda tabla debe tenerla aunque sea
> un
> identity) y luego crea un campo calculado con esta expresion:
>
> case when NombreAux is NULL then PK else NombreAux+IdNum end
>
> Finalmente crea una restriccion Unique sobre el campo calculado.
>
> "Paul" escribió en el
> mensajenews:
> Hola,
> Tengo una tabla con los campos Id, Nombe, NombreAux, IdNum. Donde
> NombreAux permite NULOS.
>
> Me gustaría crear un especie de índice único del siguiente tipo:
> Indice --> NombreAux+IdNum
>
> Pero que sólo se cumpliera se NombreAux es diferente de nulo
>
> Ejemplo:
> Id Nombre NombreAux IdNum
> 1 AAA AAA-AUX 100
> 2 BBB BBB-AUX 100
> 3 CCC NULL 100
> 4 DDD NULL 100
>
> Al insertar el registro de Id=4 No me diera error.
>
> Como lo hago?
> Saludos

Hola,
La clave única que tengo es el campo 'Id', además tambien tengo un
índice unico que es 'Nombre'.
No entiendo lo de crear el campo calculado



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida