2010-05-10 15 views
13

¿Puedo tener una columna en mi mesa de valores (valor) que se hace referencia como una clave externa a la tabla knownValues, y deja que sea NULL siempre que sea necesario, como en el ejemplo:Las claves externas y NULL en MySQL

Tabla: valores

product  type  value  freevalue 
0   1  NULL  100 
1   2  NULL  25 
3   3  1   NULL 

Tabla: tipos

id name  prefix 
0  length cm 
1  weight kg 
2  fruit NULL 

Tabla: knownValues ​​

id Type  name 
0  2  banana 

Nota: Los tipos en la tabla values & knownValues están, por supuesto, referenciados en la tabla types.

Respuesta

17

Los valores NULL en claves externas son perfectamente aceptables. Tratar con NULL en claves externas es complicado, pero eso no significa que cambie dichas columnas a NOT NULL e inserte registros ficticios ("N/A", "Desconocido", "Sin valor", etc.) en sus tablas de referencia.

El uso de valores NULL en claves externas a menudo requiere el uso de LEFT/RIGHT JOIN en lugar de INNER JOIN.

+3

El uso de INNER join o algún tipo de unión EXTERIOR depende de los resultados que está buscando. Hay momentos en que una unión INNER da exactamente la respuesta deseada. –

+1

Sí, y en los casos en que tenga filas con valores NULL en FK, no encontrará * todas * filas con una combinación interna; pero con una combinación externa. –

+1

¿algún ejemplo? Esto no funciona para mí usando InnoDB Storage Engine - MySQL – dev

3

Esta es una relación de 1 a cero a muchos. Lo he usado muchas veces con SQL Server. También creo que es posible hacer esto con MySQL.

Prefiero evitar valores NULL en mis bases de datos debido a problemas relacionados con la agregación de datos, por lo que, dependiendo de mi diseño, puse una fila UNKNOWN en la tabla de búsqueda.

+4

¡Hola Raj! ¿Qué quiere decir con "fila DESCONOCIDA"? – Industrial

1

Sí, es muy posible tener un NULL en su columna de clave foránea. Lo intenté. Tenga en cuenta que si no está utilizando el motor de almacenamiento InnoDB, sus restricciones de clave externa serán ignoradas de todos modos.

+0

¡Usando InnoDB por supuesto! – Industrial

4

Aunque puede hacer que las columnas de clave externa sean nulables, sugeriría que generalmente es mejor diseñar tablas sin claves externas con nulos. Los nulos invariablemente conducen a ciertas ambigüedades y resultados incorrectos, pero eso es doblemente un problema si se espera que las columnas en cuestión estén sujetas a alguna restricción.

+1

Hola David, ¿cómo lo harías? ¿Una tabla adicional solo para valores de texto libre? – Industrial

+1

Sí, ponerlo en otra mesa es la forma obvia de hacerlo. Si representa hechos en tablas con el conjunto correcto de atributos, entonces no necesitará usar nulos para atributos que no se apliquen. Solo agregue valores nulos al modelo donde haya alguna ventaja especial al hacerlo o donde alguna limitación de software lo obligue. – sqlvogel

1

Por supuesto, hay posibilidades de que tenga valores NULL en la clave externa, pero para eso no tiene que preocuparse por esto, espero que haya usado InnoDB como motor de base de datos para administrar las restricciones clave. Para este caso, sugiero usar Left Join o Right Join para obtener filas de DB y Group By se puede usar para evitar la duplicación. Por favor, no use Inner Join.

Cuestiones relacionadas