Utilisateur:Darkoneko/SQL/contraintes integrite
Un article de Wikipédia, l'encyclopédie libre.
Sommaire |
[modifier] contraintes d'integrite
ce sont les regles que doivent suivre les donnees pour etre coherentes.
il y en a 4 grands types
- contrainte referentielle : (clé étrangere)
la valeur cle etrangere ne peut etre qu'une valeur correspondante du champ cle primaire a laquelle elle est reliée (mais peut etre nulle)
- contraintes de domaine (n'importe quel attribut)
sert a donner des contraintes sur le type de donnes et ses bornes
- contraintes d'entité (clé primaire)
- unicité (clé primaire)
[modifier] cle primaire
soit on precise PRIMARY KEY a la fin du champ, soit on le met dans un ligne a la fin de la requete de creation de la table
ex :
- ..., champ1 INT(11) PRIMARY KEY, ...
- .. , champ1 INT(11), ......... PRIMARY KEY (champ1, attr2...) );
il est possible dans le dernier cas de mettre un cle primaire sur un groupe d'attributs
[modifier] cle etrangeres
MySQL ne gere pas les clefs etrangeres
pour en creer, il faut que la table source ET la date sur laquelle la clef pointe soient au format InnoDB
(par defaut, le format est MyISAM)
il est possible d'avoir des tables de plusieurs formats differents dans une meme base
pour creer une table en format InnoDB, il suffit de rajouter
... ) type=InnoDB;
ou
... ) engine = InnoDB;
a la fin de la requete de creation
l'ajout de cle etrangere est fait par la balise REFERENCES
[modifier] gestion des violations de contraintes
Il faut definir la reaction appliquee lorsque qu'un enregistrement cle etrangere est modifie/supprimé
en cas de suppression : ON DELETE
en cas de modification : ON UPDATE
- RESTRICT ou NO ACTION (par defaut) : empecher la suppression dans la table principale d'un tuple lie a au moins une cle etrangere)
- CASCADE : reporter les modifications
- SET NULL : la/les clef etrangeres liees passent a NULL
- SET DEFAULT : la/les clef etrangeres liees passent a la valeur par defaut
[modifier] index
un index est une 'table des matieres' permettant une recherche plus rapide dans les tables.
MySQL ne cree pas d'index tout seul, il faut le faire a sa place
utilisation :
INDEX nomIndex (nomAttributConcerné)
a mettre au meme endroit que la 2eme solution des PRIMARY KEY
[modifier] contraintes de domaine
CREATE TABLE ( ... ... ... ... CHECK (numTresorier <> numSecretaire) ); Note : c'est du SQL standard mais ça ne marche absolument pas avec MySQL -- la contrainte ne sert donc à rien.
[modifier] note
Il est possible de donner un nom à toutes les contraintes, pour pouvoir les retoucher par la suite.
CONSTRAINT nomContrainte containteEnElleMeme