¿Puedo asegurarme de que dos columnas no tengan el mismo valor?


11

Si tengo una mesa que se ve así

CREATE TABLE foo (
   id INT NOT NULL AUTO_INCREMENT,
   aa INT NOT NULL,
   bb INT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY (aa, bb),
   CONSTRAINT aa_ref FOREIGN KEY (aa) REFERENCES bar (id),
   CONSTRAINT bb_ref FOREIGN KEY (bb) REFERENCES bar (id)
)

¿Hay alguna manera de asegurarse de que, aa != bbademás de utilizar la lógica de nivel de aplicación o forzar el fallo de un disparador ANTES DE INSERTAR?

Respuestas:


3

MySQL no admite CHECKcontrsaints directamente, aunque si tiene una versión lo suficientemente reciente, admite activadores y aumento de errores a través de SIGNAL, por lo que podría definir BEFORE INSERTy BEFORE UPDATEdesencadenadores que verifiquen los datos y generen errores si no se cumple la restricción deseada.

Esto será menos eficiente que el soporte nativo para las restricciones de verificación, por lo tanto, si está realizando un gran volumen de escrituras en esa estructura, asegúrese de analizar la diferencia de rendimiento causada por el disparador en caso de que dañe demasiado su aplicación.


8

No puedes. En la mayoría de los DBMS (Postgres, SQL-Server, Oracle, DB2 y muchos otros), puede agregar una CHECKrestricción:

ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

No veo ninguna forma de tener esto en MySQL, usando solo restricciones referenciales. Además de los desencadenantes, puede permitir que las dos columnas tengan valores iguales y simplemente ignorar las filas accediendo a la tabla siempre a través de una vista:

CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

Alternativamente, puede restringir las operaciones de Insertar y Actualizar a través de procedimientos (almacenados) que se encargan de la restricción y no permiten que se inserten (o modifiquen) datos que no la satisfacen.



-1

Las dos columnas en cuestión hacen referencia a la misma tabla de barras. ¿Podría dividir la tabla de barras en dos para que contengan id con los diferentes conjuntos de valores?


1
Entonces, digamos que tenemos tres parejas en la Footabla: (1,2) (2,3) (3,1). ¿Cómo deberíamos dividir los tres valores?
ypercubeᵀᴹ

1
Estoy de acuerdo, sugerencia equivocada.
msi77
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.