Creació de taules amb integritat referencial.

10
Integritat referencial Claus forànies Miquel Boada 25-11-2016 Objectius 1. Establir la integritat diferencial entre taules.

Transcript of Creació de taules amb integritat referencial.

Page 1: Creació de taules amb integritat referencial.

Integritat referencialClaus forànies

Miquel Boada25-11-2016

Objectius1. Establir la integritat diferencial entre taules.

Page 2: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Coneixements previs• Model Entitat-Relació.• Model relacional.• Transformació del model Entitat-Relació al model relacional.• Sistemes gestors de bases de dades (SGBD).• Creació de base de dades.• Creació de taules.

Requisits previs• Ordinador amb MySQL server instal·lat.• Client MySQL server (MySQL Workbench per la representació gràfica).• Connexió al servidor des del client • Una base de dades creada.

Autor: Miquel Boada Pàgina 2 de 10

Page 3: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Integritat referencialIntegritat referencial................................................................................................................................1Objectius....................................................................................................................................................1Coneixements previs................................................................................................................................2Requisits previs.........................................................................................................................................2Introducció. Conceptes............................................................................................................................4Un cas pràctic............................................................................................................................................4

Inserció dades.....................................................................................................................................5 Canvis en clau primària..................................................................................................................6

Restrict / No action.....................................................................................................................7 Diferència entre «restrict» i «no action»..................................................................................8 Cascade........................................................................................................................................8 Set null.........................................................................................................................................8

Creació de claus forànies.........................................................................................................................8Webgrafia...................................................................................................................................................9

Autor: Miquel Boada Pàgina 3 de 10

Page 4: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Introducció. ConceptesAmb el nom d'integritat referencial es coneix el mecanisme que obliga a la coherència de lesdades emmagatzemades en una base de dades. Així, la integritat referencial garantitza que sijo tinc una taula amb la informació dels clients i en una segona taula tota la informació de lesvendes, no pot existir cap venda associada a un client que no estigui donat d'alta en la taula ons'emmagatzema la informació dels clients.La integritat referencial no s'implementa per «art de màgia», sinó que cal indicar al sistemagestor de base de dades quins enllaços o relacions volem establir entre les diferents taules.Aquestes relacions s'apliquen mitjançant l'utilització de claus forànies («foreign key»). Una clauforània és un camp d'una taula que està enllaçat a la clau primària d'una altra taula o de lapròpia taula si s'estableix una relació reflexiva. Aquest enllaç limita els valors possibles als de laclau primària i, per tant, el camp sempre fa referència a una entitat existent.

Un cas pràcticAbans de proseguir amb com es creen les claus forànies, es farà un exemple pràctic per tal ques'entengui de forma correcte el concepte de clau forània i integritat referencial. L'exemple esbasarà amb el següent model ER.

Si transformem el model entitat relació de la imatge al model relacional , obtenim el següentmodel1.

1 S'ha utilitzat el programa MySQL Workbench per a fer el model relacional.

Autor: Miquel Boada Pàgina 4 de 10

Page 5: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Com es pot observar en la imatge, la clau primària «cp» de la taula «Població» s'ha copiat en lataula persona amb el nom de «Poblacio_cp»2 El camp «Poblacio_cp» és una referència al campidentificador «cp» de la taula població. A més, el camp «Població_cp» no permet valors NULL, osigui és una informació obligatòria ja que la participació del conjunt d'entitats «Persona»respecte «Poblacio» és total.Mitjançant «database forward engineer» del client MySQL Workbench generem les taules→segons el model relacional generat i introduim informació.

Inserció dadesA la taula de «Poblacio» podem inserir qualsevol dada sense cap limitació imposada per altrestaules; la taula «Població» no fa referència a cap altra taula i el fet que estigui referenciada noimposa limitacions en la inserció de dades.

S'han introduït dos registres associats a codis postals de la població de Granollers en la taula«Població»Quan es vol inserir informació a la taula «Persona» ho podrem fer sempre i quan el codiassociat a la seva població sigui el «08400» o «08403» que són els dos únics codis postals queexisteixen en aquest moment a la base de dades.

2 Mentre es compleixi la 3 forma normal Boyce-Codd podem assignar qualsevol nom al camp.

Autor: Miquel Boada Pàgina 5 de 10

Page 6: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Ara bé, si modifiquem o insertem un nou registre utilitzant el codi postal 08402 que no existeixa la base de dades, el sistema gestor de base de dades ens dóna un error, tal i com es potveure en la següent imatge.

Com es pot observar en el missatge d'error , ens informa de «a foreign key constraint fails» i acontinuació ens informa que el problema està entre «FOREIGN KEY(`Poblacio_cp`)REFERENCES `Poblacio`(`cp`)» que són els camps associats a la relació.

Canvis en clau primàriaCom s'observa en l'exemple anterior, els valors associats a la clau forània han de pertànyer alconjunt de valors de la clau primària: «poblacio_cp» no pot prendre com a valor un codi postalque no estigui donat d'alta a «Poblacio». Què passa però si es modifica el valor de la clauprimària quan aquest valor està referenciat per una clau forània?El sistema gestor de base de dades permet gestionar el comportament desitjat oferint vàriespossibilitats:

• Impedir l'acció: es disposa de dues subopcions◦ No action◦ Restrict

• Modificar el valor de la clau forània: es disposa de dues subopcions◦ Cascade◦ Set NULL

Autor: Miquel Boada Pàgina 6 de 10

Page 7: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Restrict / No action

L'opció restrict i no action impedeix que es pugui modificar el valor de la clau primària siaquest valor ja està referenciat per una clau forània.Seguint amb l'exemple de l'empadronament d'una persona,en la taula «Poblacio» hi ha introduïdes les poblacions que esmostren en la imatge.Per altra banda en la taula «Persona» només hi ha unapersona que té associat el codi postal 08403. Amb la configuració d'actualització «restrict» o «no action» , si modifiquem el valor del camp«cp» a la taula «Poblacio» de 08403 a 08402, el sistema ens donarà un error conforme no espot realitzar l'operació.

El motiu és que en la taula client , el camp «poblacio_cp», té associat el valor 08403 i si es fa elcanvi deixarà de ser un valor vàlid.L'opció «restrict» i «no action» també està disponible per a l'eliminació de registres. Ambaquesta opció no es pot eliminar un registre si aquest està referenciat a través de la seva clauprimària en una clau forània.

Com podem observar, l'error obtingut en els dos casos és molt semblant.

Autor: Miquel Boada Pàgina 7 de 10

Page 8: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Diferència entre «restrict» i «no action»

En el sistema gestor de base de dades MySQL server no hi ha diferència entre l'opció «restrict»i «no action». Per tant, podem utilitzar de forma indiferent una o altra opció. Hi ha altres sistemes gestors de bases de dades com IBM DB2, PostgreSQL que sí quediferencien entre els dos tipus de dada. Per aquests sistemes gestors , la diferència radica enel moment que es fa la comprovació.

• «restrict» : la viabilitat de l'operació es fa abans de realitzar qualsevol altra operació.• «no action» : la viabilitat de l'operació es fa després d'executar les instruccions prèvies.

En el video (Foreign key: no action vs restrict) es mostra el comportament d'un i altre sistemautilitzant un sistema gestor de base de dades PostgreSQL.

Cascade

Quan la configuració del comportament de la clau forània és «cascade» , els canvis que es fan ala clau primària es propaguen a la clau forània. Podem observar aquest comportament en elsegüent video : comportament claus forànies cascadaEn el cas que s'elimini el registre principal , tots els registres referenciats per la «foreign key»seran també eliminats sense avís. Per tant, cal anar en molt de compte si s'associa elcomportament «cascade» a l'operació «delete».

Set null

Quan l'actualització de la clau forània està configurada a l'opció «set null» , l'operació esrealitza amb èxit, però el valor de la clau forània s'inicialitza a valor NULL. Cal tenir en compteque només podrem utilitzar aquesta opció si es permet valor NULL en el camp associat a laclau primària: clàusula set nullL'aplicació de «Set NULL» només té sentit en la sentència «Delete» o sigui, en l'eliminació deregistres de la taula.

Creació de claus foràniesPer a crear una clau forània cal utilitzar la sentència:

[constraint [nomConstraint]]foreign key (nomcamp) references taula(campPK)

[ on delete {restrict | no action | set null | cascade} ][ on update {restrict | no action | set null | cascade} ]

Podem utilitzar la sentència anterior en la creació d'una taula o bé en la sentència «altertable»: modificació de l'estructura o característiques d'una taula.

Autor: Miquel Boada Pàgina 8 de 10

Page 9: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

La inclusió de l'opció «constraint», tot i que opcional, és recomana utilitzar-la. Ens permet«batejar» amb un nom la relació i si s'ha d'esborrar es referenciarà mitjançant aquest nom. Enel cas que no es «bategi» la relació el sistema generarà un nom únic de forma automàtica. S'hade tenir en compte que el nomConstraint ha de ser únic per a tota la base de dades. Per tant,dues taules de la mateixa base de dades no poden tenir el mateix nom de constraint3.

ExemplesEn aquest primer exemple crearem el codi associat al model entitat relació de la imatge.

Les restriccions seran que no s'ha de poder eliminar una població si hi ha alguna personaempadronada. Si cal modificar el codi postal d'una població, totes les persones que estiguinempadronades a aquell codi postal han de tenir associat també el nou codi postal.

create table poblacio( cp char(5), nom varchar(30) NOT NULL, primary key (cp)) engine=innodb;

create table persona( dni char(9), nom varchar(50) NOT NULL, pob char(5) NOT NULL, constraint fk_poblacio_persona -- Si s'ha d'esborrar la relació , s'utilitzarà el nom del constraint foreign key (pob) references poblacio(cp) on delete restrict on update cascade) engine=innodb;

3 Un bon sistema és composar el nom mitjançant el literal fk concatenat amb el nom de les dues taules. Per exemple fk_poblacio_persona sila relació és entre una població i una persona.

Autor: Miquel Boada Pàgina 9 de 10

Page 10: Creació de taules amb integritat referencial.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 2 – Introducció . Integritat referencial

Webgrafiahttp://www.vertabelo.com/blog/technical-articles/on-delete-restrict-vs-on-delete-no-action

Autor: Miquel Boada Pàgina 10 de 10