Services webmasters
Partenaires
Jeux concours gratuits
 
Créer des bases InnoDB
<<<
Créer des tables InnoDB Ajouter et retirer des données et des logs InnoDB
>>>

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.

<< Créer des tables InnoDB >>
Créer des bases InnoDB Tables InnoDB Ajouter et retirer des données et des logs InnoDB
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -