Combinación de key primaria MYSQL de 2 valores únicos y no iguales

Tengo una tabla simple de MYSQL con las siguientes columnas:

first | second 

first y el second son integers. La key principal para la tabla es

 PRIMARY KEY (`first`,`second`) 

Entonces esto permite solo una combinación única de valores como:

 first | second 1 | 2 2 | 1 

Pero esta key también acepta el mismo valor para ambas columnas. Por ejemplo:

 first | second 1 | 1 

¿Hay alguna manera de forzar ambos valores a ser diferentes usando MYSQL? Puedo consultar con PHP antes de insertlo en la database, pero me pregunto si hay alguna forma de lograrlo en MYSQL.

Esta restricción no puede aplicarse mediante una restricción PRIMARY KEY o UNIQUE.

Desafortunadamente, MySQL no hace cumplir CHECK CONSTRAINTS, que es lo que probablemente usaríamos en otras bases de datos.

Para hacer que MySQL imponga una restricción como esta, necesitaría implementar un BEFORE INSERT y un desencadenante BEFORE UPDATE .

El "truco" en el cuerpo del gatillo sería detectar esta condición que desea restringir, por ej.

  IF (NEW.first = NEW.second) THEN 

Y luego haz que el gatillo arroje un error. En versiones más recientes de MySQL, proporcione la instrucción SIGNAL para generar una exception. En las versiones anteriores de MySQL, se ejecutaba una sentencia que generaría un error (por ejemplo, realizar un SELECCIONAR contra un nombre de tabla que se sabe que no existe).


SEGUIR

La instrucción IF es válida solo dentro del context de un progtwig almacenado de MySQL (por ejemplo, un PROCEDIMIENTO, FUNCIÓN o GATILLO).

Para get este tipo de restricciones aplicadas por una statement INSERT, sin una restricción o activador, tendríamos que usar la forma INSERT ... SELECT de una instrucción INSERTAR.

Por ejemplo:

 INSERT INTO `mytable` (`first`, `second`) SELECT t.first, t.second FROM ( SELECT '1' AS `first, '1' AS `second`) t WHERE t.first <> t.second 

Como la instrucción SELECT no devuelve filas, no se insertan filas en la tabla.

Tenga en count que este enfoque aplica la restricción solo en esta statement; Esto no impide que otra session realice un INSERT que no aplica esta restricción. Para que esta restricción se imponga como una restricción "por la database", deberá implementar un desencadenante ANTES DE INSERTAR y ANTES DE ACTUALIZAR que describí anteriormente en la respuesta.