Bases de datos

SQL Server

Índices únicos con excepciones en SQL Server

Última actualización: 14-09-2024 20:22

En este enlace se puede ver la definición del comando CREATE INDEX del Transact-SQL de SQL Server.

En esa definición ya se puede ver que hay una opción "WHERE" en la que se menciona que se pueden poner filtros.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
                    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
                    [ INCLUDE ( column_name [ ,...n ] ) ]
                    [ WHERE <filter_predicate> ]
                    [ WITH ( <relational_index_option> [ ,...n ] ) ]
                    [ ON { partition_scheme_name ( column_name )
                         | filegroup_name
                         | default
                         }
                    ]
                    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
 
                [ ; ]

Resumiendo lo que tenemos es que utilizando la sintaxis básica de creación de un índice único sobre la columna de una tabla se pueden agregar condiciones para definir las excepciones en un WHERE al final del comando:

create unique index [NOMBRE DEL INDICE]
        on [TABLA] (COLUMNA)
        WHERE [CONDICIÓN 1...]
                [AND/OR] [CONDICIÓN 2...]
                [AND/OR] [CONDICIÓN N...];

Versiones MSSQL en que se ha verificado el funcionamiento de estas notas:

El ejemplo...

En este script que se comparte como ejemplo de la creación de un índice único con excepciones y las pruebas sobre el mismo se está publicando esto:

El resultado de este script de prueba aparece al final de esta página.



if not OBJECT_ID('persona__test') is null drop table persona__test;
go
 
create table persona__test (
	ID_PERSONA int identity (1, 1) not null,
	NOMBRE varchar(100),
	IDENTIFICADOR varchar(100) null
	primary key (ID_PERSONA)
);
go
 
create unique index ui_persona__test_IDENTIFICADOR on persona__test (IDENTIFICADOR) 
where  IDENTIFICADOR is not null
	and IDENTIFICADOR != 'CF' 
	and IDENTIFICADOR != '9999999';
go
 
insert into persona__test (NOMBRE, IDENTIFICADOR)
	values ('JUAN', '123')
			, ('PACO', 'CF')
			, ('PEDRO', 'CF')
			, ('MAR', NULL)
			, ('TOTO', '312')
			, ('PEPE', NULL)
			, ('KAKA', '9999999')
			, ('QUQU', '9999999')
			, ('ZAZA', '9999999');
go
 
begin try
    insert into persona__test (NOMBRE, IDENTIFICADOR) values ('TUTU', '312');
end try
begin catch    
    select ERROR_NUMBER() AS ErrorNumber
			, ERROR_SEVERITY() AS ErrorSeverity
			, ERROR_STATE() AS ErrorState
			, ERROR_PROCEDURE() AS ErrorProcedure
			, ERROR_LINE() AS ErrorLine
			, ERROR_MESSAGE() AS ErrorMessage;
end catch;
go
 
insert into persona__test (NOMBRE, IDENTIFICADOR) values ('RERE', '3312');
go
 
 
select * from persona__test order by IDENTIFICADOR, NOMBRE;
go
 
    
        (9 rows affected)
        
        
        (0 rows affected)
        
        ErrorNumber ErrorSeverity ErrorState  ErrorProcedure ErrorLine   ErrorMessage
        ----------- ------------- ----------- -------------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        2601        14            1           NULL           4           Cannot insert duplicate key row in object 'dbo.persona__test' with unique index 'ui_persona__test_IDENTIFICADOR'. The duplicate key value is (312).
        
        (1 row affected)
        
        
        (1 row affected)
        ID_PERSONA  NOMBRE    IDENTIFICADOR
        ----------- --------- --------------
        4           MAR       NULL
        6           PEPE      NULL
        1           JUAN      123
        5           TOTO      312
        11          RERE      3312
        7           KAKA      9999999
        8           QUQU      9999999
        9           ZAZA      9999999
        2           PACO      CF
        3           PEDRO     CF
        
        (10 rows affected)
        
        
        Completion time: 2024-09-14T13:04:20.6560109-06:00
        
        
            

 

Política de Privacidad

Última actualización: 23 de diciembre de 2024

 X 

Tu privacidad es importante para nosotros. En esta política de privacidad, explicamos qué información recopilamos cuando visitas nuestro sitio web y cómo utilizamos esa información.

1. Información que recopilamos

Este sitio no recopila información personal de los usuarios, excepto cuando un usuario elige voluntariamente comunicarse a través del formulario de contacto. En ese caso, los datos proporcionados (como tu nombre y correo electrónico) se utilizarán únicamente para responder a tu consulta.

2. Uso de Cookies

Este sitio web utiliza una única cookie esencial llamada PHPSESSID.

No usamos cookies de análisis ni de seguimiento.

3. Seguridad de los datos

Adoptamos medidas técnicas y organizativas razonables para proteger cualquier información que compartas con nosotros contra el acceso no autorizado, pérdida o alteración.

4. Enlaces a sitios de terceros

Nuestro sitio web puede contener enlaces a otros sitios web. No somos responsables de las prácticas de privacidad ni del contenido de dichos sitios.

5. Cambios en esta política de privacidad

Nos reservamos el derecho de actualizar esta política de privacidad en cualquier momento. Cualquier cambio será publicado en esta misma página e incluirá la fecha de la última actualización.

6. Contacto

Si tienes preguntas o inquietudes sobre esta política de privacidad, puedes comunicarte con nosotros a través de la página de contacto disponible en este sitio web.

7. Cumplimiento con Normativas Internacionales de Privacidad

Nuestro sitio web cumple con las principales regulaciones internacionales de protección de datos personales para garantizar la privacidad y seguridad de los usuarios. Esto incluye, pero no se limita a, las siguientes leyes:

Si tienes preguntas o dudas sobre el cumplimiento de estas leyes, no dudes en ponerte en contacto conmigo a través de la página de contacto de este sitio web.