¿Cómo mantener la integridad referencial en una base de datos SQL multitable
Incluso si todas las mesas en su sistema SQL tiene la integridad de entidad y la integridad de dominio, es posible que tenga un problema debido a inconsistencias en la forma de una tabla se refiere a otro. En las bases de datos multimesa más bien diseñados, cada tabla contiene al menos una columna que hace referencia a una columna en otra tabla en la base de datos.
Conteúdo
Estas referencias son importantes para mantener la integridad general de la base de datos. Las mismas referencias, sin embargo, hacen anomalías de actualización posible. Actualizar anomalías son problemas que pueden ocurrir después de actualizar los datos en una fila de una tabla de base de datos.
Problemas entre tablas primarias y secundarias
Las relaciones entre tablas generalmente no son bidireccionales. Una tabla es por lo general depende de la otra. Digamos que usted tiene una base de datos con una tabla CLIENTE y una tabla Pedidos. Usted puede entrar un cliente en la tabla CLIENTE antes de que ella hace órdenes. No puede, sin embargo, entrar en una orden en la tabla PEDIDOS menos que usted ya tiene una entrada en la tabla CLIENTE para el cliente que está haciendo ese orden.
La tabla PEDIDOS depende de la tabla CLIENTE. Este tipo de arreglo se llama a menudo relación padre-hijo, donde CLIENTE es la tabla padre y órdenes es la tabla secundaria. El niño es dependiente de la matriz.
En general, la clave principal de la tabla principal es una columna (o grupo de columnas) que aparece en la tabla secundaria. Dentro de la tabla secundaria, esa misma columna (o grupo) es una clave externa. Tenga en cuenta, sin embargo, que una clave externa no tiene que ser único.
Actualizar anomalías surgen de varias maneras entre tablas primarias y secundarias. Un cliente se aleja, por ejemplo, y desea eliminar la información de su base de datos. Si ella ya ha hecho algunas órdenes (que se registran en la tabla PEDIDOS), borrar ella desde la tabla CLIENTE podría presentar un problema.
Tendrías registros de la tabla PEDIDOS (infantil) para los que tiene no hay registros correspondientes en la tabla CLIENTE (padre). Problemas similares pueden surgir si se agrega un registro a una tabla secundaria sin hacer una adición correspondiente a la tabla padre.
Las correspondientes claves externas en todas las tablas secundarias deben reflejar cualquier cambio en la clave principal de una fila en una mesa- padres de lo contrario se producirá un actualización de anomalías.
Utilice cascada eliminaciones con cuidado
Usted puede eliminar la mayoría de los problemas de integridad referencial al controlar cuidadosamente el proceso de actualización. En algunos casos, usted tiene que cascada supresiones de una tabla padre para sus hijos. Para una eliminación en cascada cuando se elimina una fila de una tabla padre, también elimina todas las filas de sus tablas secundarias cuyas claves extranjera que coincida con la clave principal de la fila eliminada en la tabla padre.
Echa un vistazo a el siguiente ejemplo:
CREAR CLIENTE MESA (ClientName CHAR (30) PRIMARY KEY, Address1 CHAR (30), Address2 CHAR (30), CityCHAR (25) NOT NULL, StateCHAR (2), PostalCode CHAR (10), PhoneCHAR (13), Fax CHAR ( 13), Persona de contacto CHAR (30)) PRUEBAS DE MESA -create (TestName CHAR (30) PRIMARY KEY, StandardCharge CHAR (30)) EMPLEADO TABLA -CREAR (EmployeeName CHAR (30) PRIMARY KEY, ADDRESS1 CHAR (30), Address2 CHAR ( 30), CityCHAR (25), StateCHAR (2), PostalCode CHAR (10), HomePhone CHAR (13), OfficeExtension CHAR (4), HireDate FECHA, JobClassification CHAR (10), HourSalComm CHAR (1)) PEDIDOS DE MESA -create (OrderNumber INTEGER PRIMARY KEY, ClientName CHAR (30), TestOrdered CHAR (30), Vendedor de CHAR (30), FECHA FechaPedido, CONSTRAINT NameFK EXTRANJEROS CLAVE (CLIENTNAME) REFERENCIAS DE CLIENTES (ClientName) ON DELETE CASCADE, CONSTRAINT TestFK FOREIGN KEY (TestOrdered) REFERENCIAS PRUEBAS (TestName) ON DELETE CASCADE, CONSTRAINT SalesFK FOREIGN KEY (Vendedor) REFERENCIAS DEL EMPLEADO (EmployeeName) ON DELETE CASCADE) -
La restricción NameFK nombres Nombre de Cliente como una clave externa que hace referencia a la Nombre de Cliente columna en la tabla CLIENTE. Si elimina una fila en la tabla CLIENTE, también elimina automáticamente todas las filas de la tabla PEDIDOS que tengan el mismo valor en el Nombre de Cliente columna como los de la Nombre de Cliente columna de la tabla CLIENTE.
Las cascadas de eliminación abajo de la tabla CLIENTE a la tabla Pedidos. Lo mismo es cierto para las claves foráneas de la tabla Pedidos que hacen referencia a las claves principales de las pruebas y las mesas de los empleados.
Formas alternativas para controlar las anomalías de actualización
Puede que no quiera en cascada una deleción. En cambio, es posible que desee cambiar la clave externa de la tabla secundaria a una NULO valor. Considere la siguiente variante:
CREAR LAS ÓRDENES DE MESA (OrderNumber INTEGER PRIMARY KEY, ClientName CHAR (30), TestOrdered CHAR (30), vendedor CHAR (30), FECHA FechaPedido, CONSTRAINT NameFK EXTRANJEROS CLAVE (CLIENTNAME) REFERENCIAS DE CLIENTES (ClientName), CONSTRAINT TestFK FOREIGN KEY (TestOrdered) REFERENCIAS PRUEBAS (TestName), CONSTRAINT SalesFK FOREIGN KEY (Vendedor) REFERENCIAS DEL EMPLEADO (EmployeeName) ON DELETE SET NULL) -
La restricción SalesFK nombres del Vendedor columna como una clave externa que hace referencia a la Nombre de empleado columna de la tabla EMPLEADO. Si un vendedor deja la empresa, se elimina la fila de la tabla EMPLOYEE. Nuevos vendedores son finalmente asignados a sus cuentas, pero por ahora, borrar su nombre de la tabla EMPLOYEE hace que todos sus pedidos en la mesa a fin de recibir un valor nulo en el Vendedor columna.
También puede mantener los datos inconsistentes fuera de una base de datos mediante el uso de uno de estos métodos:
Negarse a permitir una adición a una mesa niño hasta que existe una fila correspondiente en la tabla padre. Si usted se niega a permitir que las filas de una tabla secundaria sin una fila correspondiente en una tabla padre, a prevenir la ocurrencia de " huérfano " filas de la tabla secundaria. Esta negativa ayuda a mantener la coherencia entre las tablas.
Negarse a permitir cambios en la clave principal de una tabla. Si usted se niega a permitir cambios en la clave principal de una tabla, usted no tiene que preocuparse por la actualización de claves externas de otras tablas que dependen de esa clave primaria.