Tengo una mesa y, de alguna manera, la misma persona se metió en mi Person
mesa dos veces. En este momento, la clave principal es solo un número automático, pero existen otros dos campos que quiero forzar para que sean únicos.
Por ejemplo, los campos son:
ID
Name
Active
PersonNumber
Solo quiero 1 registro con un PersonNumber único y Active = 1.
(Por lo tanto, la combinación de los dos campos debe ser única)
¿Cuál es la mejor manera en una tabla existente en el servidor SQL? Puedo hacerlo, así que si alguien más hace una inserción con el mismo valor que un valor existente, falla, así que no tengo que preocuparme por esto en mi código de aplicación.
sql
sql-server
leora
fuente
fuente
Respuestas:
Una vez que haya eliminado sus duplicados:
o
Por supuesto, a menudo puede ser mejor verificar primero esta violación, antes de dejar que SQL Server intente insertar la fila y devolver una excepción (las excepciones son costosas).
http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling
http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/
Si desea evitar que surjan excepciones en la aplicación, sin realizar cambios en la aplicación, puede usar un
INSTEAD OF
activador:Pero si no le dice al usuario que no realizó la inserción, se preguntará por qué los datos no están allí y no se informó ninguna excepción.
EDITAR aquí es un ejemplo que hace exactamente lo que está pidiendo, incluso usando los mismos nombres que su pregunta, y lo demuestra. Debe probarlo antes de asumir que las ideas anteriores solo tratan una columna u otra en lugar de la combinación ...
Datos en la tabla después de todo esto:
Mensaje de error en la última inserción:
fuente
Esto también se puede hacer en la GUI:
fuente
new Index
No se puede hacer clic en My, está desactivado :(En mi caso, necesitaba permitir muchas inactivas y solo una combinación de dos teclas activas, como esta:
Esto parece funcionar:
Aquí están mis casos de prueba:
fuente
Y si tiene muchas consultas de inserción pero no desea enviar un mensaje de ERROR cada vez, puede hacerlo:
fuente