2011-12-07 17 views
6

Tengo una tabla en la que tengo algunas columnas a,b,c y para cada columna hay otra columna, por ejemplo, (x,y,z) que depende de a,b,c respectivamente.create table constraint in mysql

x,y,z tendrá el valor 1 si a,b,c tiene algún valor y contendrá nulo si a,b,c has null.

Para un ejemplo Permite decir, Los valores almacenados en a es 2 y x es la columna dependiente de ella. Entonces x tendrá valor como 1.

Si los valores almacenados en a es null continuación x tendrá valor como null.

por lo que hay una manera en que podemos declarar esta restricción en el momento de la creación de la tabla.

Por favor, sugiera cualquier cosa que no sean desencadenantes.

+0

chicos gracias por las respuestas, pero sugiéranme cualquier cosa que no sean desencadenantes, porque he leído que podemos poner algunas restricciones en la creación de la tabla ... –

+0

No, no se puede. A diferencia de la mayoría de los otros DBMS (Postgre, Oracle, SQL Server ...), MySQL no admite restricciones de verificación. –

Respuesta

7

Si el propósito de x, y y z es simplificar algunas consultas a continuación, en lugar de tener x, y y z como columnas en la tabla también se puede considerar el uso de un objeto de hacer esto, por ejemplo,

create view myview as 
    select a, b, c, 
    if (isnull(a), null, 1) as x, 
    if (isnull(b), null, 1) as y, 
    if (isnull(c), null, 1) as z 
    from mytable; 

y luego base sus otras consultas en esta vista en lugar de directamente en la tabla.

+0

Gracias por su respuesta, pero en esa tabla hay muchos lugares donde se realizan las inserciones. Es una gran aplicación y tenemos dos plataformas diferentes ... –

+0

¿Puede explicar el enfoque o proporcionar una referencia de esto? esta. –

+0

Hola. ¿Qué bit no está claro? La documentación de MySQL sobre vistas es [aquí] (http://dev.mysql.com/doc/refman/5.6/en/views.html). – mikej

1

MySQL no maneja CONSTRAINTS per se, sino que podría implementar un comportamiento similar utilizando un TRIGGER en los BEFORE INSERT y BEFORE UPDATE eventos. Sin embargo, tendrá que confiar en otras restricciones de nivel de tabla (NOT NULL) para que funcione, según this other question on SO.

En su caso muy específico, se parece mucho a que desea utilizar el disparador para calcular el valor de sus x, y, z valores en el desencadenador, en lugar de usarlo para evitar la inserción de datos con valores "incorrectos", pero su pregunta no aclara este punto inequívocamente, por lo que depende de lo que realmente desea.

1

Sí, puede usar triggers para esto.

Desde el capítulo Trigger syntax:

Si un disparador antes de que falle, la operación en la fila correspondiente no se realiza

Aunque el escenario que usted describe implica que los datos no se normaliza.

1

Además de las limitaciones, se puede lograr un resultado similar por no almacenamiento a todos los x, y, columnas z y el uso de una vista:

CREATE VIEW myView AS 
SELECT 
    a, b, c, 
    (a = a) AS x, 
    (b = b) AS y, 
    (c = c) AS z 
FROM myTable 
4

La restricción que busca es la restricción de comprobación.

CREATE TABLE test 
(
    a varchar(10), 
    b varchar(10), 
    c varchar(10), 
    x integer, 
    y integer, 
    z integer, 
    CONSTRAINT chk_X_Nulls CHECK ((a is null and x is null) or (a is not null and x = 1)), 
    CONSTRAINT chk_Y_Nulls CHECK ((b is null and y is null) or (b is not null and y = 1)), 
    CONSTRAINT chk_Z_Nulls CHECK ((c is null and z is null) or (c is not null and z = 1)) 
); 

Desafortunadamente esto no se implementa en MySQL. Hay un open bug report que data de 2004 para esta característica, así que no espere verlo pronto.

Otros han respondido que puede usar activadores o vistas para lograr el resultado deseado, y estas son las respuestas correctas para MySQL.

También puede restringir parcialmente sus datos usando algunos trucos sencillos:

  • Establecer el tipo de datos de x, y, z-enum('1'). Esto evitará que se inserten valores distintos de null y '1', pero no garantizará que los valores sean correctos.
  • Si a, b, c tienen un rango limitado de valores posibles que puede crear restricciones de clave externa a otras tablas y poblar esas tablas con cada valor posible de a, b, c
  • Se puede crear un event para actualizar x, y, z en un horario (por ejemplo, una vez cada hora o una vez al día). Los valores para x, y, z se pueden corregir si son incorrectos.

se puede ver la restricción de comprobación en la acción con PostGreSQL here

Si necesita más información por favor explicar por qué los desencadenantes no son apropiados para la tarea.

Cuestiones relacionadas