Maison > Article > base de données > Comment définir des contraintes de clé étrangère dans MySQL ?
Comment définir des contraintes de clé étrangère dans MySQL : Vous pouvez spécifier la clé étrangère via le mot-clé FOREIGN KEY, la syntaxe "ALTER TABLE nom de la table ADD CONSTRAINT nom de la clé étrangère FOREIGN KEY (nom de la colonne) REFERENCES nom de la table principale ( nom de la colonne) );".
(tutoriel recommandé : tutoriel vidéo mysql)
(1) L'utilisation des clés étrangères :
Il existe deux fonctions principales des clés étrangères :
L'une est de laisser le base de données elle-même Assurer l'intégrité et la cohérence des données grâce aux clés étrangères
L'une consiste à augmenter la lisibilité du diagramme ER
Certaines personnes pensent que l'établissement de clés étrangères apportera beaucoup de problèmes à la base de données pendant le développement Parce que. la base de données Parfois, les développeurs ne parviennent pas à supprimer ou à insérer des opérations parce qu'ils ne réussissent pas la détection de la clé étrangère. Ils pensent que c'est très gênant
En fait, cette clé étrangère formelle vous oblige à garantir l'intégrité et la cohérence des données. une bonne chose.
Par exemple :
Il existe un tableau de données de base pour enregistrer toutes les informations du produit. Les autres tables stockent toutes les ID de produit. Lors de l'interrogation, vous devez rejoindre la table pour interroger le nom du produit. La table produit du document 1 a un champ ID produit, et la table produit du document 2 a également un champ ID produit . Si vous n'utilisez pas de clés étrangères, lorsque les documents 1 et 2 utilisent tous deux le produit avec l'ID produit = 3, si vous supprimez l'enregistrement correspondant avec l'ID = 3 dans la table produit, vous ne pourrez pas retrouver le produit lors de la visualisation documents 1 et 2. nom.
Lorsqu'il n'y a que quelques tables, certains pensent que l'intégrité et la cohérence des données peuvent être assurées par l'écriture de scripts lors de la mise en œuvre du programme. Autrement dit, lors de la suppression d'un produit, vérifiez si le produit avec l'ID de produit 3 a été utilisé dans les documents 1 et 2. Mais une fois que vous avez fini d'écrire le script, le système ajoute un document 3, qui enregistre également l'ID du produit et recherche un champ. Si vous n'utilisez pas de clés étrangères, vous ne pourrez toujours pas trouver le nom du produit. Vous ne pouvez pas simplement revenir en arrière et modifier votre script pour détecter si le produit est utilisé à chaque fois que vous ajoutez un document qui utilise le champ ID du produit. Dans le même temps, l'introduction de clés étrangères ralentira la vitesse. et les performances.
(2) Ajoutez le format de clé étrangère :
ALTER TABLE yourtablename
ADD [CONSTRAINT Foreign Key Name] FOREIGN KEY [id] (index_col_name , ...)
RÉFÉRENCES tbl_name (index_col_name, ...)
[ON DELETE {CASCADE | SET NULL | NO ACTION RESTRICT}]
[ON UPDATE {CASCADE | }]
Description :
on delete/on update, utilisé pour définir les opérations de suppression et de mise à jour. Voici différents types de contraintes pour les opérations de mise à jour et de suppression :
CASCADE :
Clés étrangères dans les tables de clés étrangères. La valeur du champ sera mise à jour ou la colonne dans laquelle elle se trouve sera supprimée
RESTRICT :
RESTRICT équivaut également à aucune action, c'est-à-dire qu'aucune opération n'est effectuée. a refusé de mettre à jour la colonne associée à la clé étrangère et de supprimer l'enregistrement.
set null :
Lorsque le champ lié à la clé étrangère du parent est mis à jour ou supprimé, la colonne de clé étrangère de la table enfant est définie sur null.
Et pour l'insertion, la valeur saisie dans la colonne clé étrangère de la table enfant, Il ne peut s'agir que de la valeur existante de la colonne associée à la clé étrangère de la table parent.
La définition des clés étrangères est soumise aux conditions suivantes : (Prérequis)
1)
Toutes les tables Elles doivent être de type InnoDB, et elles ne peuvent pas être des tables temporaires car seules les tables de type InnoDB prennent en charge les clés étrangères. dans MySQL.
2)
Tous les champs à établir comme clés étrangères doivent être indexés.
3)
Pour les tables non-InnoDB, la clause FOREIGN KEY sera ignorée.
Remarque :
Lors de la création d'une clé étrangère, les guillemets ne peuvent pas être utilisés lors de la définition du nom de la clé étrangère.
Par exemple : la contrainte 'fk_1' ou la contrainte "fk_1" est incorrecte
( 3) Afficher la clé étrangère :
SHOW CREATE TABLE *** Vous pouvez afficher le code de la table nouvellement créée et son moteur de stockage. Vous pouvez également voir les paramètres de la clé étrangère.
Supprimer l'étranger. key:
alter table drop Foreign Key 'Foreign Key Name'.
Remarque:
Uniquement lors de la définition d'une clé étrangère, utilisez la contrainte Foreign Key Name.... pour faciliter la suppression de la clé étrangère.
S'il n'est pas défini, vous pouvez :
Entrer d'abord : modifier la clé étrangère de suppression de la table --> Une erreur s'affichera. À ce moment, le message d'erreur affichera le nom de la clé étrangère par défaut du système. clé. --->
Utilisez-le pour supprimer la clé étrangère.
(4) Exemple
Exemple 1 :
4.1
CREATE TABLE parent(id INT NOT NULL,
PRIMARY KEY (id)
) TYPE=INNODB; -- type=innodb Équivalent à engine= innodb
CREATE TABLE child(id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) TYPE=INNODB;
Après avoir inséré les données dans le parent, insérez les données dans l'enfant. Lors de l'insertion, la valeur de parent_id dans l'enfant ne peut être que les données dans le parent, sinon l'insertion échouera.
Lors de la suppression de l'enregistrement parent ; , l'enregistrement correspondant dans l'enfant Il sera également supprimé ;-->Car : lors de la suppression en cascade
Lors de la mise à jour de l'enregistrement parent, il ne sera pas mis à jour ;-->Parce qu'il n'est pas défini, la valeur par défaut est restreindre .
4.2
Si l'enfant est le suivant :
mysql>
créer une table enfant(id int non nul clé primaire auto_increment,parent_id int,
index par_ind (parent_id),
contrainte fk_1 références de clé étrangère (parent_id)
parent(id) lors de la mise à jour en cascade lors de la suppression de la restriction)
type=innodb;
Utilisez ce qui précède :
1).
Lorsque vous mettez à jour le parent record, l'enregistrement correspondant dans l'enfant sera également mis à jour ;--> Parce que : lors de la mise à jour en cascade
2).
ne peut pas être une opération de table enfant qui affecte la table parent. qui affecte la table enfant.
3).
Supprimer la clé étrangère :
altérer la table enfant supprimer la clé étrangère fk_1;
Ajouter une clé étrangère :
alter table enfant ajouter une contrainte fk_1 clé étrangère (parent_id ) références
parent(id) lors de la mise à jour restreindre lors de la suppression définir null ;
(5) Plusieurs clés étrangères existent :
Le La table product_order possède des clés étrangères vers les deux autres tables. CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, RÉFÉRENCES client(id)) TYPE=INNODB; (6) 说明 : 1.若不声明lors de la mise à jour/suppression, 则默认是采用restreindre方式.
Une clé étrangère fait référence à un index à deux colonnes dans la table product. Un autre index à une seule ligne référencé dans la table client : NODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) TYPE=INNODB;
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
CLÉ PRIMAIRE (non),
-- 双外键
INDEX (catégorie_produit, id_produit),
CLÉ ÉTRANGÈRE (catégorie_produit, id_produit)
RÉFÉRENCES produit (catégorie, identifiant)
EN CASCADE DE MISE À JOUR SUR LA SUPPRESSION DE LA RESTRICTION,
-- 单外键
INDEX (id_client),
CLÉ ÉTRANGÈRE (id_client)
2.对于外键约束,最好是采用 : SUR LA MISE À JOUR EN CASCADE SUR LA SUPPRESSION DE LA RESTRICTION 的方式.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!