MySQL 5 : Les vues — (part 3/7)
Restrictions
Lors de la création d’une vue, certaines contraintes doivent être prises en compte :
- Il n’est pas possible de créer un index sur une vue
- La vue ne peut pas contenir de sous-requêtes dans la clause FROM du SELECT.
- Il n’est pas possible d’utiliser de variables dans une vue.
- Les objets (tables et vues) nécessaires à la création de la vue doivent exister avant de la créer.
- Si un objet référencé par la vue est effacé, la vue n’est alors plus accessible.
- Une vue ne peut référencer une table temporaire (TEMPORARY TABLE)
- Il n’est pas possible de créer des vues temporaires.
- Il n’est pas possible d’associer un trigger à une vue.
- La définition d’une vue est « gelée » dans une requête préparée.
Exemple:
mysql> CREATE VIEW ma_vue AS SELECT 'première valeur'; Query OK, 0 rows affected (0.24 sec) mysql> desc ma_vue; +-----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-------------+------+-----+---------+-------+ | première valeur | varchar(15) | NO | | | | +-----------------+-------------+------+-----+---------+-------+ 1 row in set (0.50 sec) mysql> PREPARE req_prepare FROM 'SELECT * FROM ma_vue'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE req_prepare; +-----------------+ | première valeur | +-----------------+ | première valeur | +-----------------+ 1 row in set (0.01 sec) ALTER VIEW ma_vue AS SELECT 'deuxième valeur'; Query OK, 0 rows affected (0.05 sec) mysql> desc ma_vue; +-----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-------------+------+-----+---------+-------+ | deuxième valeur | varchar(15) | NO | | | | +-----------------+-------------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> EXECUTE req_prepare; +-----------------+ | première valeur | +-----------------+ | première valeur | +-----------------+ 1 row in set (0.00 sec)
Il faut en fait recréer la requête préparée :
mysql> DEALLOCATE PREPARE req_prepare; Query OK, 0 rows affected (0.00 sec) mysql> PREPARE req_prepare FROM 'SELECT * FROM ma_vue'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE req_prepare; +-----------------+ | deuxième valeur | +-----------------+ | deuxième valeur | +-----------------+ 1 row in set (0.00 sec)