Clave externa

Ir a: navegación, búsqueda de

En el contexto de bases de datos relacionales, un clave externa es un campo (o colección de campos) en uno mesa identifica de forma única una fila de otra tabla.[1][2][3] En palabras más simples, la clave foránea se define en una segunda tabla, pero se refiere a la clave principal de la primera tabla. Por ejemplo, una tabla llamada a empleado tiene una clave principal llamada employee_id. Otra tabla llamada empleado detalles tiene una clave externa que hace referencia a employee_id con el fin de identificar la relación entre ambos las tablas.

La tabla que contiene la clave externa se llama el hace referencia a o tabla secundaria, y la tabla que contiene la clave de candidato se llama el se hace referencia o tabla primaria.[4]

Puesto que el propósito de la clave externa es identificar una fila determinada de la mesa que se hace referencia, generalmente es necesario que la clave externa es igual a la clave de candidato en alguna fila de la tabla primaria, si no tiene ningún valor (el NULL valor.[2]). Esta regla se llama un restricción de integridad referencial entre las dos tablas.[5] Porque las violaciones de estas restricciones pueden ser la fuente de muchos problemas de base de datos, más sistemas de gestión de base de datos proporcionan mecanismos para asegurar que cada clave foránea no nulo corresponde a una fila de la tabla de referencia.[6][7][8]

Por ejemplo, considere una base de datos con dos tablas: una tabla de clientes que incluye todos los datos del cliente y una tabla de orden de que incluye todos los pedidos del cliente. Supongamos que la empresa requiere que cada orden debe referir a un cliente. Para reflejar esto en la base de datos, se agrega una columna de clave foránea a la tabla de pedido (por ejemplo, IDCLIENTE), que hace referencia a la clave principal del cliente (por ejemplo ID). Porque la clave primaria de una tabla debe ser única, y porque CUSTOMERID sólo contiene los valores de ese campo de clave principal, podemos asumir, cuando tiene un valor CUSTOMERID identificará al cliente particular que colocó la orden. Sin embargo, esto puede no ser asumido si la tabla de pedido no se mantiene hasta la fecha cuando se eliminan las filas de la tabla cliente o alteradas de la columna ID, y trabajar con estas tablas puede volverse más difícil. Muchas bases de datos del mundo real solucionar este problema 'inactivo' en lugar de eliminar físicamente llaves foraneas tabla maestra, o por los programas de actualización complejos que modifican todas las referencias a una clave externa cuando un cambio es necesario.

Las claves externas juegan un papel esencial diseño de base de datos. Una parte importante del diseño de base de datos es asegurarse de que las relaciones entre las entidades del mundo real se reflejan en la base de datos de referencias, usando llaves foraneas para referirse de una tabla a otra.[9] Otra parte importante del diseño de base de datos es normalización de bases de datos, en qué tablas están rotas aparte y extranjeros llaves hacen posible que puedan ser reconstruidos.[10]

Varias filas en la tabla de referencia (o niño) pueden referirse a la misma fila en la que se hace referencia (o padres) mesa. En este caso, la relación entre las dos tablas se llama un uno a muchos relación entre la tabla referenciada y hace referencia a la tabla.

Además, la mesa del niño y los padres pueden, de hecho, la misma mesa, es decir, la clave foránea remite a la misma mesa. Tan una clave externa es conocida en SQL:2003 como un hace referencia a sí mismo o recursivo clave externa. En sistemas de gestión de base de datos, a menudo esto se logra mediante la vinculación de primera y segunda referencia a la misma mesa.

Una tabla puede tener múltiples claves foráneas, y cada clave foránea puede tener una tabla primaria diferentes. Cada clave foránea se aplica independientemente de la sistema de base de datos. Por lo tanto, pueden establecerse en cascada las relaciones entre tablas usando llaves foraneas.

Contenido

  • 1 Definición de claves foráneas
  • 2 Acciones referenciales
    • 2.1 CASCADA
    • 2.2 RESTRINGIR
    • 2.3 NINGUNA ACCIÓN
    • 2.4 SET DEFAULT, SET NULL
    • 2.5 Factores desencadenantes
  • 3 Ejemplo
  • 4 Véase también
  • 5 Referencias
  • 6 Enlaces externos

Definición de claves foráneas

Las claves externas se definen en la norma ISO de SQL, a través de una clave externa restricción. La sintaxis para agregar una restricción de tal a una tabla existente se define en SQL:2003 como se muestra a continuación. Omitir la lista de columnas en la cláusula REFERENCES implica que la clave foránea deberá hacer referencia a la clave primaria de la tabla de referencia.

ALTER MESA <MESA identificador>
   AÑADIR [ RESTRICCIÓN <RESTRICCIÓN identificador> ]
      EXTRANJERA CLAVE ( <COLUMNA expresión> )
      REFERENCIAS <MESA identificador> [ ( <COLUMNA expresión> {, <COLUMNA expresión>}... ) ]
      [ ON ACTUALIZACIÓN <acción referencial> ]
      [ ON BORRAR <acción referencial> ]

Asimismo, las claves externas pueden definirse como parte de la CREAR TABLA Instrucción SQL.

CREAR MESA TABLE_NAME (
ID NÚMERO ENTERO  PRIMARIA CLAVE,
col2 PERSONAJE VARIANDO(20),
COL3 NÚMERO ENTERO,
   ...
   EXTRANJERA CLAVE(COL3)
      REFERENCIAS other_table(key_col) ON BORRAR CASCADA,
   ... )

Si la clave externa es sólo una sola columna, la columna puede marcarse como tal mediante la sintaxis siguiente:

CREAR MESA TABLE_NAME (
ID NÚMERO ENTERO  PRIMARIA CLAVE,
col2 PERSONAJE VARIANDO(20),
COL3 NÚMERO ENTERO REFERENCIAS other_table(column_name),
   ... )

Las claves externas pueden definirse con una procedimiento almacenado Declaración.[otra explicación necesitado]

sp_foreignkey tabname, pktabname, col1 [, col2] ...  [, col8]
  • tabname:: el nombre de la tabla o vista que contiene la clave foránea a definirse.
  • pktabname:: el nombre de la tabla o vista que tiene la clave principal al que se aplica la clave foránea. La clave primaria ya debe ser definida.
  • col1:: el nombre de la primera columna que compone la clave foránea. La clave foránea debe tener al menos una columna y puede tener un máximo de ocho columnas.

Acciones referenciales

Artículo principal: Restricción de propagación

Porque el sistema de gestión de base de datos impone restricciones de referencia, se debe asegurar la integridad de los datos si son filas de una tabla que se hace referencia a ser eliminado (o actualizado). Si todavía existen filas dependientes en referencia a las tablas, las referencias tienen que ser considerados. SQL:2003 especifica 5 diferentes acciones referenciales llevará a cabo en tales ocurrencias:

  • CASCADA
  • RESTRINGIR
  • NINGUNA ACCIÓN
  • SET NULL
  • AJUSTE POR DEFECTO

CASCADA

Cuando las filas de la tabla maestra (referencia) son eliminadas (o actualizadas), las filas respectivas de la tabla secundaria (referenciación) con una columna de clave foránea que empareja serán eliminadas (o actualizadas) también. Esto se llama una cascada delete (o actualización).

RESTRINGIR

Un valor no puede ser actualizado o eliminado cuando existe una fila en una tabla de referencia o un niño que hace referencia el valor en la tabla de referencia.

Del mismo modo, no se puede eliminar una fila mientras hay una referencia a ella de una tabla de referencia o un niño.

Para comprender restringir (cascada) mejor, puede ser útil notar la diferencia siguiente, que puede no ser inmediatamente evidente. La acción referencial cascada modifica el "comportamiento" de la tabla (niño) donde se utiliza la palabra cascada. Por ejemplo, ON DELETE CASCADE efectivamente dice "cuando se elimina la fila que se hace referencia en la otra tabla (tabla principal), a continuación, elimine también de mí". Sin embargo, la acción referencial restringir modifica el "comportamiento" de la mesa principal, No el niño de la tabla, aunque la palabra restringir aparece en la tabla secundaria y no en la mesa principal! Entonces, efectivamente ON DELETE restringir dice: "cuando alguien intenta eliminar la fila de la otra tabla (tabla principal), evitar la eliminación de esa otra mesa (y por supuesto, también no borrar de mí, pero eso no es el punto principal aquí)."

RESTRICCIÓN no es apoyado por Microsoft SQL 2012 y antes.

NINGUNA ACCIÓN

NO restringir y acción son muy parecidos. La principal diferencia entre la NO acción y restringir es que con ninguna acción se realiza la comprobación de integridad referencial después de intentar modificar la tabla. RESTRICT hace la comprobación antes de intentar ejecutar el ACTUALIZACIÓN o BORRAR Declaración. Ambas acciones referenciales del mismo actúan si falla la verificación de la integridad referencial: la instrucción UPDATE o DELETE resultará en un error.

En otras palabras, cuando se ejecuta una instrucción UPDATE o DELETE en la tabla que se hace referencia mediante la acción referencial ninguna acción, el DBMS verifica al final de la ejecución de la declaración que ninguna de las relaciones referenciales son violada. Esto es diferente a restringir, que asume desde el principio que la operación violará la restricción. NINGUNA acción, usando el factores desencadenantes o la semántica de la declaración puede producir un estado final en el que no hay relaciones clave extranjeras son violadas por el tiempo que finalmente se comprueba la restricción, permitiendo así la declaración completar con éxito.

SET DEFAULT, SET NULL

En general, las medidas adoptadas por el DBMS SET NULL o establecer por defecto es el mismo para ambos ON DELETE u ON UPDATE: se cambia el valor de los atributos afectados hace referencia a NULL para SET NULL y el valor predeterminado especificado para establecer por defecto.

Factores desencadenantes

Generalmente se implementan acciones referenciales como implícita factores desencadenantes (es decir, desencadena con nombres generados por el sistema, a menudo ocultados). Por lo tanto, están sujetos a las mismas limitaciones que los desencadenadores definidos por el usuario, y su orden de ejecución en relación con otros desencadenantes puede que deba ser considerado; en algunos casos puede ser necesario reemplazar la acción referencial con su equivalente gatillo definidos por el usuario para asegurar el orden correcta ejecución, o para evitar limitaciones mutando-table.

Otra limitación importante aparece con aislamiento de la transacción:: los cambios a una fila no pueden ser capaces de cascada completamente porque hace referencia a datos de la transacción no puede "ver" y por lo tanto no puede cascada en la fila. Un ejemplo: mientras que la transacción está intentando volver a numerar una cuenta de cliente, una transacción simultánea está tratando de crear una nueva factura para ese mismo cliente; mientras una regla cascada podrá fijar todas las filas de factura que su transacción puede ver para mantenerlas constantes con la fila actual del cliente, no puede llegar en otra transacción para fijar los datos porque la base de datos no puede garantizar datos consistentes cuando cometen las dos operaciones, una de ellas se verá forzada a retroceder (a menudo sobre una base llega-primero-atendido).

CREAR MESA cuenta (acct_num INT, cantidad DECIMAL(10,2));
CREAR GATILLO ins_sum ANTES DE INSERTAR ON cuenta PARA CADA FILA CONJUNTO @SUMA = @SUMA + Nuevo.cantidad;

Ejemplo

Como un primer ejemplo para ilustrar las claves externas, supongamos que una base de datos de cuentas tiene una tabla con las facturas y cada factura se asocia a un proveedor en particular. Los detalles del proveedor (como nombre y dirección) se guardan en una tabla separada; cada proveedor se da un "número de proveedor" para identificarlo. Cada registro de factura tiene un atributo que contiene el número de proveedor de la factura. Entonces, el 'número de proveedor' es la clave primaria de la tabla proveedor. La clave foránea en las facturas de mesa apunta a la clave principal. El esquema relacional es el siguiente. Las claves primarias están marcadas en negritas y claves foráneas están marcadas en cursiva.

(Proveedor SupplierNumberNombre, dirección, tipo) facturas () InvoiceNumber, SupplierNumberTexto)

El correspondiente Lenguaje de definición de datos Declaración es como sigue.

  CREAR MESA Proveedor (
SupplierNumber NÚMERO ENTERO NO NULL,
Nombre VARCHAR(20) NO NULL,
Dirección VARCHAR(50) NO NULL,
     TIPO            VARCHAR(10),
     RESTRICCIÓN supplier_pk PRIMARIA CLAVE(SupplierNumber),
     RESTRICCIÓN number_value CHEQUE (SupplierNumber > 0) )
 
  CREAR MESA Facturas (
InvoiceNumber NÚMERO ENTERO NO NULL,
SupplierNumber NÚMERO ENTERO NO NULL,
Texto VARCHAR(4096),
     RESTRICCIÓN invoice_pk PRIMARIA CLAVE(InvoiceNumber),
     RESTRICCIÓN inumber_value CHEQUE (InvoiceNumber > 0),
     RESTRICCIÓN supplier_fk EXTRANJERA CLAVE(SupplierNumber)
        REFERENCIAS Proveedor(SupplierNumber)
        ON ACTUALIZACIÓN CASCADA ON BORRAR RESTRINGIR )

Véase también

  • Clave de candidato
  • Compuesto clave
  • Superkey
  • Tabla de cruce

Referencias

  1. ^ Coronel, Carlos (2010). Sistemas de base de datos: Diseño, implementación y gestión. Independencia KY: South-Western/Cengage Learning. p. 65. ISBN978-0-538-74884-1.
  2. ^ a b Elmasri, Ramez (2011). Fundamentos de sistemas de base de datos. Addison-Wesley. págs. 73-74. ISBN978-0-13-608620-8.
  3. ^ Fecha, J. C. (1996). Una guía para el estándar SQL. Addison-Wesley. p. 206. ISBN978-0201964264.
  4. ^ Sheldon, Robert (2005). Empezando en MySQL. John Wiley & Sons. PP. 119-122. ISBN0-7645-7950-9.
  5. ^ "Fundamentos de bases de datos — claves foráneas". 2010-03-13.
  6. ^ MySQL AB (2006). Guía y referencia del lenguaje de MySQL Administrator. Sams Publishing. p. 40. ISBN0-672-32870-4.
  7. ^ Powell, Gavin (2004). Oracle SQL: Jumpstart con ejemplos. Elsevier. p. 11. ASINB008IU3AHY.
  8. ^ Mullins, Craig (2012). Guía del desarrollador de DB2. IBM Press. ASINB007Y6K9TK.
  9. ^ Sheldon, Robert (2005). Empezando en MySQL. John Wiley & Sons. p. 156. ISBN0-7645-7950-9.
  10. ^ Garcia-Molina, Héctor (2009). Sistemas de base de datos: El libro completo. Prentice Hall. págs. 93-95. ISBN978-0-13-187325-4.

Enlaces externos

  • SQL-99 llaves foraneas
  • Claves externas PostgreSQL
  • Llaves foraneas MySQL
  • FirebirdSQL llaves foraneas
  • Soporte SQLite para las claves externas
  • Microsoft SQL 2012 table_constraint (Transact-SQL)

Otras Páginas

Obtenido de"https://en.copro.org/w/index.php?title=Foreign_key&oldid=633669539"