Clave compuesta de MySQL: combinaciones únicas

-1

Supongamos que hay una tabla con columnas ay b, y con clave compuesta única del a,bpar. 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.

Alexey
fuente
Parece que funcionaría de la misma manera a=2, b=1tal como lo haría a=1, por b=2lo que ya tiene la respuesta a esta pregunta. Esto significaría que solo puede tener 1 registro en la tabla donde a=2y b=1tal como funcionaría para el registro a=1y b=2para 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.
Pimp Juice IT
UNIQUE KEY uk_ab (a,b)permite insertar a=2,b=1cuando a=1,b=2existe :(
Alexey
Han actualizado la publicación con el ejemplo.
Alexey
Sí, eso suena correcto, permitirá un registro de esos mismos valores para que me parezca correcto. a=2,b=1es un registro y a=1,b=2es 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.
Pimp Juice IT

Respuestas:

2

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, asiempre tenga el valor más alto bo 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.

Seth
fuente