Maison  >  Article  >  base de données  >  Où les vues MySQL peuvent-elles être incohérentes et comment garantir leur cohérence ?

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

PHPz
PHPzavant
2023-09-17 12:33:04907parcourir

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;

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)

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)

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)

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)

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)

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer