7.5 Tables InnoDB
7 Types de tables MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Présentation des tables InnoDB . Options de démarrage InnoDB . Créer des bases InnoDB ->Créer des tables InnoDB . Ajouter et retirer des données et des logs InnoDB . Sauver et restaurer une base InnoDB . Transférer une base de données InnoDB vers une autre machine . Modèle transactionnel de InnoDB . Implémentation du multi-versionnage . Structures de tables et d'index . Gestion de l'espace fichiers et des entrées/sorties disque . Gestion des erreurs . Restrictions sur les tables InnoDB . Historique de l'évolution InnoDB . Informations de contact InnoDB
|
7.5.4 Créer des tables InnoDB Supposons que vous avez démarré le client MySQL avec la commande
mysql test
.
Pour créer une table au format InnoDB vous devez spécifier le type
TYPE = InnoDB
lors de la création de table, dans la commande SQL :
CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB;
|
Cette commande SQL va créer une table et un index sur la colonne
A
dans la base InnoDB constituée par les fichiers de données que vous avez spécifié
dans le fichier de configuration
my.cnf
. De plus, MySQL va créer un fichier
CUSTOMER.frm
dans le dossier de données de MySQL
test
.
En interne, InnoDB va ajouter une entrée dans son propre dictionnaire de données
une entrée pour la table
'test/CUSTOMER'
. De cette façon, vous pouvez
créer plusieurs table avec le même nom de
CUSTOMER
, mais dans d'autres
bases MySQL, et les noms de seront pas en conflit avec InnoDB.Vous pouvez demander la quantité d'espace disponible dans l'espace de tables
InnoDB avec la commande de statut de MySQL pour toutes les tables de type
TYPE = InnoDB
. La quantité d'espace disponible apparaît dans la section
de commentaire de la commande
SHOW
. Par exemple :
SHOW TABLE STATUS FROM test LIKE 'CUSTOMER'
|
Notez que les statistiques que
SHOW
vous donne sur les tables InnoDB
ne sont que des approximations : elles sont utilisées pour les optimisations
SQL par MySQL. Les tailles réservées d'index et de table, exprimées en octets,
sont précises.
Convertir une table MyISAM en InnoDB
InnoDB n'a pas d'optimisation particulière pour la création d'un fichier
externe d'index. Donc, exporter pour réimporter les données n'apporte pas
de gain de performances. La méthode la plus rapide pour donner à une table
le format InnoDB est de faire les insertions directement dans la table InnoDB,
avec la commande
ALTER TABLE ... TYPE=INNODB
, ou de créer une table
vide InnoDB avec les mêmes caractéristiques, et d'insérer les lignes avec
la commande
INSERT INTO ... SELECT * FROM ...
.
Pour avoir un meilleur contrôle sur le processus d'insertion, c'est une bonne
idée de faire les insertions par portions de table :
INSERT INTO newtable SELECT * FROM oldtable WHERE votre_cle > borne1 AND votre_cle <= borne2;
|
Une fois que toutes les données ont été insérées, vous pouvez renommer les
tables.Durant la conversion des grandes tables, vous devriez utiliser le buffer InnoDB
en lui donnant une grande taille pour réduire les accès disques. Ne lui donnez
pas une taille supérieure à 80% de votre mémoire physique. Vous devriez
aussi avoir de grand fichiers de log et un buffer de log important.
Assurez vous que vous avez toujours de l'espace pour les données : les tables
InnoDB prennent bien plus de place que les tables MyISAM. Si une commande
ALTER TABLE
rencontre un problème d'espace disque, elle va s'annuler,
et cela va prendre des heures si le disque est plein.
Lors des insertions, InnoDB utilise un buffer d'insertion pour fusionner les
index par groupe. Cela économise beaucoup d'accès disques. Lors d'une annulation,
aucun mécanisme de ce type n'est utilisé, et l'annulation peut prendre jusqu'à
30 fois la durée de l'insertion.
Dans le cas d'une annulation, si vous n'avez pas de données importante dans votre
base, il est mieux de terminer le processus et de détruire les données InnoDB
et les fichiers de log, ainsi que le fichier de table
.frm
, et de
recommencer, plutôt que d'attendre les millions d'accès disques.
Contraintes de clé étrangères
Depuis la version 3.23.43b, InnoDB supporte les contraîntes de clé étrangères.
InnoDB est le premier géstionnaire de tables MySQL qui permet de définir des
contraîntes de clé étrangères pour assurer la cohérence de vos données.La syntaxe d'une clé étrangère avec InnoDB :
[CONSTRAINT symbol] FOREIGN KEY (index_col_name, ...) REFERENCES table_name (index_col_name, ...) [ON DELETE CASCADE | ON DELETE SET NULL]
|
Les deux tables doivent être de type InnoDB et
il doit y avoir un
index dans lesquelles les colonnes de clé étrangère et de clé référencée
sont en premier
. InnoDB ne crée pas automatiquement des index pour les clés
étrangères et les clé référencées : vous devez le faire vous même.Les colonnes correspondantes dans la clé étrangère doivent être de même
type interne à InnDB, de façon à ce qu'elle puissent être comparées
sans conversion.
La
taille et le signe des types entiers doivent être les mêmes
.
La taille des chaînes n'a pas besoin d'être les mêmes.
Depuis la version 3.23.50, vous pouvez aussi associer la clause
ON DELETE CASCADE
ou
ON DELETE SET NULL
avec les contraintes de clé étrangère.
Si
ON DELETE CASCADE
est spécifié, et qu'une ligne de la table
parente est effacée, alors InnoDB va automatiquement effacer la
lgine dans la table fille, dont la clé étrangère est égale à la clé référencée
dans la table parente. Si
ON DELETE SET NULL
est spécifié,
les lignes de la table fille sont automatiquement modifiée de façon à
ce que les colonnes dans la clé étrangère prennent automatiquement la
valeur SQL de NULL.
Depuis la version 3.23.50, InnoDB ne vérifie pas les contraintes de clé
étrangère pour ces clés étrangères, ou les clés qui font référence à
la valeur NULL.
Depuis la version 3.23.50, InnoDB vous permet d'utiliser les guillemets
américains (`) autour des noms de tables et colonnes dans la clause
FOREIGN KEY ... REFERENCES ...
mais InnoDB ne prend pas encore en compte
l'option
lower_case_table_names
que vous pouvez spécifier dans le fichier
my.cnf
.
Un exemple :
CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL ) TYPE=INNODB;
|
Si MySQL retourne une erreur numéro 1005 à la commande
CREATE TABLE
,
et que l'erreur fait référence à au numéro 150, alors la création de table
a échoué car la clé étrangère est mal formée.
De même, si une commande
ALTER TABLE
échoue avec un numéro
d'erreur de 150, cela signifie que la définition de la clé étrangère a été
mal formée dans la table.Depuis la version 3.23.50, InnoDB vous permet d'ajouter une nouvelle
clé étrangère, comme ceci :
ALTER TABLE yourtablename ADD [CONSTRAINT symbol] FOREIGN KEY (...) REFERENCES anothertablename(...)
|
N'oubliez pas de commencer par créer vos index.
En InnoDB versions inférieures à 3.23.50,
ALTER TABLE
ou
CREATE INDEX
ne doivent pas être utilisée avec les tables
qui ont une clé étrangère, ou qui sont référencées dans une clé étrangère :
toute commande
ALTER TABLE
supprime les contraintes de clé
étrangère définie dans la table. Vous de devez pas utiliser la commande
ALTER TABLE
dans la table référencée non plus, mais utilisez plutôt
DROP TABLE
et
CREATE TABLE
pour modifier le schéma.
Lorsque MySQL fait un
ALTER TABLE
il peut utiliser en interne la commande
RENAME TABLE
, et cela va poser un problème à la clé étrangère à laquelle
la table se réfère. Une commande
CREATE INDEX
est traitée par MySQL
comme une commande
ALTER TABLE
, et les mêmes restrictions s'appliquent.
Lorsqu'il fait des vérifications de clé étrangères, InnoDB pose des
verrous de lignes sur les lignes filles et mères qu'il doit utiliser.
InnoDB vérifie les contraintes immédiatement : la vérification n'est pas
reportée à la validation de la transaction.
InnoDB vous permet d'effacer n'importe quelle table, même si cela
casse la cohérence d'une clé étrangère, qui fait référence à la table.
Lorsque vous effacez une table, les contraintes qui en faisaient parties
sont aussi effacées.
Si vous recréez une table qui a été effacée, elle doit avoir une
définition qui satisfont les contraintes de clé étrangères. Elle doit
avoir les bons noms et types de colonnes, ainsi que les index nécessaires.
Si ces conditions ne sont pas remplies, MySQL retourne une erreur numéro 1005,
et fait référence au numéro de message 150.
Depuis la version 3.23.50, InnoDB retourne la définition de contrainte
de clé étrangère lorsque vous appelez la commande
SHOW CREATE TABLE yourtablename
|
De plus,
mysqldump
produit la définition correcte pour les tables
dans l'export, et n'oublie pas les clés étrangères.Vous pouvez aussi lister les clés étrangères pour une table
T
avec
SHOW TABLE STATUS FROM yourdatabasename LIKE 'T'
|
Les contraintes de clé sont listées dans les commentaires de la table.
|