Disculpas si mi redacción es muy incómoda/no adecuada para un programador: solo soy un novato de SQL que está tomando una clase para principiantes.
Estoy usando PHPMyAdmin para diseñar una base de datos de comercio electrónico en la que la edad mínima de un cliente es de 18 años. Debido a que la edad es una columna calculada, quiero registrar el DOB y hacer cumplir una restricción CHECK. Intenté esto pero no funcionó:
CREATE TABLE Customer( ... DOB date NOT NULL CHECK(DATEDIFF(year, CURDATE(), DOB))>=18), ...);Recibí un error que decía:
La función o expresión 'curdate()' no se puede usar en la cláusula CHECK de
DOB
¿Hay alguna manera de hacer cumplir la restricción MySQL CHECK para el valor calculado?
En MySQL, las restricciones CHECK se aplican todo el tiempo a una fila, no solo cuando se insertan o actualizan datos.
Si lee atentamente la documentación, encontrará esta "limitación":
- Se permiten literales, funciones integradas deterministas y operadores. Una función es determinista si, dados los mismos datos en tablas, múltiples invocaciones producen el mismo resultado, independientemente del usuario conectado. Ejemplos de funciones que no son deterministas y fallan en esta definición: CONNECTION_ID(), CURRENT_USER(), NOW().
Está tratando de agregar una restricción usando una de estas funciones no deterministas. Ese es el problema.
Tenga en cuenta que esto no es realmente una "limitación". Es la definición de restricción de check . Debido a que los valores de estas funciones cambian, no hay forma de que la base de datos pueda garantizar que los datos almacenados en la fila cumplan con la restricción. Usted y podría saber que now() solo aumenta y una vez que se cumple la restricción, siempre es cierto. Es mucho más difícil para la base de datos saber eso.
Quizás la solución más simple sea usar un disparador para hacer cumplir la restricción cuando se insertan datos en la tabla.