Maison > base de données > tutoriel mysql > le corps du texte

Où les vues MySQL peuvent-elles être incohérentes et comment garantir leur cohérence ?

PHPz
Libérer: 2023-09-17 12:33:04
avant
911 Les gens l'ont consulté

Où les vues MySQL peuvent-elles être incohérentes et comment garantir leur cohérence ?

Dans le cas d'une vue actualisable, nous sommes susceptibles de mettre à jour des données qui ne sont pas visibles via la vue car la vue que nous créons n'affiche qu'une partie des données de la table. Cette mise à jour rend la vue incohérente. Nous pouvons garantir la cohérence de la vue en utilisant AVEC OPTION DE VÉRIFICATION lors de la création ou de la modification de la vue. Bien que la clause WITH CHECK OPTION soit une partie facultative de l'instruction CREATE VIEW, elle est très utile pour rendre la vue cohérente.

Fondamentalement, la clause WITH CHECK OPTION nous empêche de mettre à jour ou d'insérer des lignes qui ne sont pas visibles via la vue. En termes simples, nous pouvons dire qu'après avoir utilisé la clause WITH CHECK OPTION, MySQL s'assure que l'opération d'insertion ou de mise à jour est confirmée par la définition de la vue. Voici la syntaxe de la clause WITH CHECK OPTION -

Syntaxe

CREATE OR REPLACE VIEW view_name AS Select_statement WITH CHECK OPTION;
Copier après la connexion

Exemple

Pour illustrer le concept ci-dessus, nous utilisons les données suivantes de la table "Student_info" -

mysql> Select * from student_info;
+------+---------+------------+------------+
| id   | Name    | Address    | Subject    |
+------+---------+------------+------------+
| 101  | YashPal | Amritsar   | History    |
| 105  | Gaurav  | Chandigarh | Literature |
| 125  | Raman   | Shimla     | Computers  |
| 130  | Ram     | Jhansi     | Computers  |
+------+---------+------------+------------+
4 rows in set (0.08 sec)
Copier après la connexion

Maintenant, à l'aide de la requête suivante, nous allons créer le nom de la vue" Info". Ici, nous n'utilisons pas WITH CHECK OPTION.

mysql> Create OR Replace VIEW Info AS Select Id, Name, Address, Subject from student_info WHERE Subject = 'Computers';
Query OK, 0 rows affected (0.46 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
+------+-------+---------+-----------+
2 rows in set (0.00 sec)
Copier après la connexion

Parce que nous n'utilisons pas WITH CHECK OPTION, nous pouvons insérer/mettre à jour de nouvelles lignes dans "Info" même si cela ne correspond pas à sa définition. La requête ci-dessous et ses résultats illustrent cela -

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(132, 'Shyam','Chandigarh', 'Economics');
Query OK, 1 row affected (0.37 sec)

mysql> Select * from student_info;
+------+---------+------------+------------+
| id   | Name    | Address    | Subject    |
+------+---------+------------+------------+
| 101  | YashPal | Amritsar   | History    |
| 105  | Gaurav  | Chandigarh | Literature |
| 125  | Raman   | Shimla     | Computers  |
| 130  | Ram     | Jhansi     | Computers  |
| 132  | Shyam   | Chandigarh | Economics  |
+------+---------+------------+------------+
5 rows in set (0.00 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
+------+-------+---------+-----------+
2 rows in set (0.00 sec)
Copier après la connexion

Le résultat défini ci-dessus montre que la nouvelle ligne ne correspond pas à la définition de "Info", elle n'est donc pas visible dans la vue. Maintenant, dans la requête suivante, nous allons créer la même vue "Info"

en utilisant "WITH CHECK OPTION" -

mysql> Create OR Replace VIEW Info AS Select Id, Name, Address, Subject from student_info WHERE Subject = 'Computers' WITH CHECK OPTION;
Query OK, 0 rows affected (0.06 sec)
Copier après la connexion

Maintenant, si nous essayons d'insérer une ligne correspondant à la définition de la vue "Info", MySQL permet Nous faisons cela. Cela peut être effacé de la requête et de ses résultats ci-dessous.

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(133, 'Mohan','Delhi','Computers');
Query OK, 1 row affected (0.07 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
| 133  | Mohan | Delhi   | Computers  |
+------+-------+---------+-----------+
3 rows in set (0.00 sec)
Copier après la connexion

Mais supposons que si nous essayons d'insérer une ligne qui ne correspond pas à la définition de la vue "Info", MySQL ne nous permettra pas de le faire et générera une erreur -

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(134, 'Charanjeet','Amritsar','Geophysics');
ERROR 1369 (HY000): CHECK OPTION failed
Copier après la connexion

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!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal