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

#6 Paul
19/02/2008 - 08:35 | Informe spam
On 18 Feb, 21:39, "Rolando" wrote:
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
mensajenews:

> 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



Hola,

Como crear el campo calculado desde el Management

Gracias
Respuesta Responder a este mensaje
#7 Alejandro Mesa
19/02/2008 - 14:47 | Informe spam
Paul,

Te recomiendo lo hagas mediante codigo T-SQL, de esa manera te familiarizas
con el lenguaje.

alter table tu_tabla
add nueva_columna as case when NombreAux is null then ltrim([Id]) else
Nombreaux end

create unique conclustered indexes tu_tabla_nueva_columna_u_nc_ix
on tu_tabla(nueva_columna)
go


AMB


"Paul" wrote:

On 18 Feb, 21:39, "Rolando" wrote:
> 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
> mensajenews:
>
> > 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

Hola,

Como crear el campo calculado desde el Management

Gracias

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