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.