vehiculos vehicular santiago restricción restriccion hoy cataliticos calendario año mysql unique-constraint

mysql - vehicular - ¿Puedo imponer condicionalmente una restricción de unicidad?



restricción vehicular hoy (4)

Diferente manera de lograr el mismo resultado. Puede que no sea realmente necesario para la pregunta formulada. Pero sólo por información.

  1. Crear un disparador al insertar / actualizar
  2. Verifique si se encontraron registros duplicados con los valores de registros actuales (NUEVOS).
    a. Esto se puede verificar contando dupicates o comprobando que OTROS registros existen con los mismos valores, pero con una clave primaria diferente
  3. Si se encuentra levanta una Signal para lanzar un error.

Esto es más adecuado si su condición es compleja para decidir la singularidad. También considere el costo de rendimiento.

Muestra

DELIMITER $$ CREATE TRIGGER `my_trigger` BEFORE INSERT/UPDATE ON `usertable` FOR EACH ROW BEGIN IF EXISTS (SELECT 1 FROM usertable WHERE userid <> NEW.userid AND username = NEW.username AND isactive = 1) THEN SELECT CONCAT(NEW.username, '' exists !'') INTO @error_text; SIGNAL SQLSTATE ''45000'' SET message_text = @error_text; END IF; END$$ DELIMITER ;

Mi base de datos contiene una tabla de usuarios. Cada usuario activo tiene un nombre de usuario único. Me gustaría poder desactivar a un usuario y liberar el nombre de usuario que están usando, pero mantenerlos en la misma tabla.

¿Hay una manera de imponer condicionalmente solo la restricción de unicidad?


No, si hay un índice único (de ahí el nombre) no puede haber duplicados. O bien agregue una columna adicional para hacer que cada registro sea único. O cambiar el valor para que sea único.

No recomendado, pero por ejemplo, puede agregar una marca de tiempo "USUARIO BORRADO 2013/08/17: 233805"


No, una restricción UNIQUE no puede ser "condicional".

Una opción es establecer la columna de username en NULL. La restricción UNIQUE permitirá múltiples filas con valor NULL.

Podrías traducir eso a cualquier cadena que quisieras mostrar. ya sea en la aplicación, o en el SQL

SELECT IFNULL(t.username,''USER DELETED'') AS username FROM mytable t

Si está reteniendo estas filas para propósitos históricos / de archivo, probablemente NO quiera actualizar la columna de username . (Si cambia el valor de la columna de username de username , una declaración posterior podrá insertar una fila con el mismo valor que el nombre de usuario anterior).

En su lugar, podría agregar una columna adicional a su tabla, para representar la condición de "usuario eliminado". Por ejemplo:

user_deleted TINYINT(1) UNSIGNED DEFAULT 0 COMMENT ''boolean''

Puede verificar esta columna y devolver la constante ''USER DELETED'' en lugar de la columna de nombre de usuario siempre que se user_deleted booleano user_deleted el user_deleted :

SELECT IF(u.user_deleted,''USER DELETED'',u.username) AS username

(Use un valor de 1 para indicar una condición lógica "eliminado por el usuario").

La gran ventaja de este enfoque es que la columna de username NO tiene que modificarse, el valor del username y la restricción ÚNICA evitarán que se inserte una nueva fila con un nombre de usuario duplicado.


Añade otra columna llamada algo como isactive . El crear una restricción única en (username, isactive) .

Entonces puede tener un nombre de usuario activo e inactivo al mismo tiempo. No podrás tener dos nombres de usuario activos.

Si desea varios nombres inactivos, use NULL para el valor de isactive . NULL valores NULL se pueden repetir en un índice único.