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