Supongamos que hay una tabla con columnas a
y b
, y con clave compuesta única del a,b
par. Y hay fila a=1, b=2
.
Entonces no puedo insertar otra fila a=1, b=2
, está bien.
Pero, ¿cómo podría negar en esta situación también insertar fila a=2, b=1
?
Por ejemplo:
CREATE TABLE `t` (`a` INT, `b` INT);
ALTER TABLE `t` ADD UNIQUE(`a`, `b`);
INSERT INTO `t` (`a`, `b`) VALUES ('1', '2');
INSERT INTO `t` (`a`, `b`) VALUES ('2', '1');
El segundo inserto funciona, aunque espero que falle.
a=2
,b=1
tal como lo haríaa=1
, porb=2
lo que ya tiene la respuesta a esta pregunta. Esto significaría que solo puede tener 1 registro en la tabla dondea=2
yb=1
tal como funcionaría para el registroa=1
yb=2
para ese registro, solo uno permitido con ese combo de teclas único ... Parece que lo tienes bajo control para mí. ... es decir,UNIQUE KEY 'uk_ab' ('a','b')
esto funcionaría igual para AMBOS que en su ejemplo de su pregunta.UNIQUE KEY uk_ab (a,b)
permite insertara=2,b=1
cuandoa=1,b=2
existe :(a=2,b=1
es un registro ya=1,b=2
es otro registro. Solo puede tener UN registro donde cada uno de esos sean verdaderos donde a y b sean iguales a algún valor, de modo que sus dos ejemplos sean diferentes y no iguales, de modo que sea correcto. Intente insertar otro registro donde esos sean los mismos nuevamente y confirme que está funcionando.Respuestas:
No puede con una definición clave / índice. Desde una perspectiva DB, los valores de (1,2) y (2,1) siempre serán diferentes.
La solución sería asegurar que, por ejemplo,
a
siempre tenga el valor más altob
o viceversa. Puede asegurarse de esto en la aplicación que agrega el registro o como un desencadenador de base de datos.Ver también: combinación de teclas única MySQL que tiene un ejemplo de cómo hacer esto con un disparador.
fuente