Syntaxe de CREATE INDEX
<<<
Syntaxe de CREATE TABLE Syntaxe de DROP DATABASE
>>>

14.2 Définition de données : CREATE , DROP , ALTER
14 Syntaxe des commandes SQL
 Manuel de Référence MySQL 4.1 : Version Française

Syntaxe de ALTER DATABASE
Syntaxe de ALTER TABLE
Syntaxe de CREATE DATABASE
Syntaxe de CREATE INDEX
->Syntaxe de CREATE TABLE
Syntaxe de DROP DATABASE
Syntaxe de DROP INDEX
Syntaxe de DROP TABLE
Syntaxe de RENAME TABLE

14.2.5 Syntaxe de CREATE TABLE


CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options] [select_statement]
ou :

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(] LIKE old_tbl_name [)];

create_definition:
    column_definition
  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
  | KEY [index_name] [index_type] (index_col_name,...)
  | INDEX [index_name] [index_type] (index_col_name,...)
  | [CONSTRAINT [symbol]] UNIQUE [INDEX]
        [index_name] [index_type] (index_col_name,...)
  | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)
  | [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (index_col_name,...) [reference_definition]
  | CHECK (expr)

column_definition:
    col_name type [NOT NULL | NULL] [DEFAULT default_value]
        [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string']
        [reference_definition]

type:
    TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  | INT[(length)] [UNSIGNED] [ZEROFILL]
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
  | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME
  | TIMESTAMP
  | DATETIME
  | CHAR(length) [BINARY | ASCII | UNICODE]
  | VARCHAR(length) [BINARY]
  | TINYBLOB
  | BLOB
  | MEDIUMBLOB
  | LONGBLOB
  | TINYTEXT
  | TEXT
  | MEDIUMTEXT
  | LONGTEXT
  | ENUM(value1,value2,value3,...)
  | SET(value1,value2,value3,...)
  | spatial_type

index_col_name:
    col_name [(length)] [ASC | DESC]

reference_definition:
    REFERENCES tbl_name [(index_col_name,...)]
               [MATCH FULL | MATCH PARTIAL]
               [ON DELETE reference_option]
               [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options: table_option [table_option] ...

table_option:
    {ENGINE|TYPE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM}
  | AUTO_INCREMENT = value
  | AVG_ROW_LENGTH = value
  | CHECKSUM = {0 | 1}
  | COMMENT = 'string'
  | MAX_ROWS = value
  | MIN_ROWS = value
  | PACK_KEYS = {0 | 1 | DEFAULT}
  | PASSWORD = 'string'
  | DELAY_KEY_WRITE = {0 | 1}
  | ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED }
  | RAID_TYPE = { 1 | STRIPED | RAID0 }
        RAID_CHUNKS = value
        RAID_CHUNKSIZE = value
  | UNION = (tbl_name[,tbl_name]...)
  | INSERT_METHOD = { NO | FIRST | LAST }
  | DATA DIRECTORY = 'absolute path to directory'
  | INDEX DIRECTORY = 'absolute path to directory'
  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]

select_statement:
    [IGNORE | REPLACE] [AS] SELECT ...   (Some legal select statement)
CREATE TABLE Crée une table avec le nom donné, dans la base de données courante. Vous avez besoin des droits de CREATE pour créer une table.

Les règles de nommage des tables sont disponibles dans Noms de base de données, tables, index, colonnes et alias . Par défaut, une table est créée dans la base de données courante. Une erreur est affichée s'il n'y a pas de base courante, si la base de données n'existe pas ou si la table existe déjà.

En MySQL 3.22 et plus récent, le nom de la table peut être spécifié avec la syntaxe db_name.tbl_name , pour créer une table dans une base spécifique. Cela fonctionne même s'il n'y a pas de base courante. Si vous utilisez les identifiants protégez, et mettez le nom de la base et de lui de la table entre guillemets, séparément. Par exemple, `madb`.`matbl` est valide, mais `madb.matbl` ne l'est pas.

Depuis la version 3.22 de MySQL, vous pouvez utiliser le mot réservé TEMPORARY lorsque vous créez une table. Une table temporaire sera immédiatement effacée dès que la connexion se termine. Cela signifie que vous pouvez utiliser le même nom de table temporaire depuis deux connexions différentes sans risque de conflit entre les connexions. Vous pouvez aussi utiliser une table temporaire qui a le même nom qu'une table existante (la table existante est alors cachée tant que dure la table temporaire). En MySQL version 4.0.2 ou plus récent, vous avez juste à avoir le privilège CREATE TEMPORARY TABLES pour créer des tables temporaires.

Depuis la version 3.23 de MySQL, vous pouvez utiliser le mot réservé IF NOT EXISTS , de façon à ce qu'aucune erreur ne soit affiché si la table que vous essayez de créer existe déjà. Notez qu'il n'y a pas de comparaisons entre les structures de table lors du test d'existence.

MySQL représente chaque table par un fichier de définition de table .frm , placé dans le dossier de la base de données. Le moteur de la table peut créer d'autres fichiers complémentaires. Dans le cas des tables MyISAM , le moteur de stockage utilise trois fichiers, avec le nom nom_de_table :

Fichier Rôle
nom_de_table.frm Fichier de définition de la table
nom_de_table.MYD Fichier de données
nom_de_table.MYI Fichier d'index

Les fichiers créés par les moteurs de stockages pour représenter les tables sont décrits dans la section Types de tables MySQL .

Pour des informations générales sur les propriétés des différentes colonnes, voyez Types de colonnes . Pour des informations sur les types de données spatiaux, voyez Extensions spatiale de MySQL .
  • Si ni NULL , ni NOT NULL n'est spécifié, une colonne utilisera par défaut l'attribut NULL (elle acceptera les valeurs NULL ).
  • Une colonne de nombre entier peut se voir attribuer l'attribut AUTO_INCREMENT . Lorsque vous insérez la valeur NULL (recommandée) ou 0 dans une colonne AUTO_INCREMENT , la colonne prendra automatiquement la valeur de value+1 , où value est la plus grande valeur positive courante dans cette colonne. La série des valeurs AUTO_INCREMENT commence à 1 . mysql_insert_id() .

    Depuis MySQL 4.1.1, en spécifiant l'option NO_AUTO_VALUE_ON_ZERO pour le mode --sql-mode ou la variable serveur sql_mode permet de stocker la valeur 0 dans les colonnes de type AUTO_INCREMENT , au lieu de voir 0 prendre le prochain numéro de séquence. Options de ligne de commande mysqld .

    Note : Il ne peut y avoir qu'une seule colonne de type AUTO_INCREMENT dans une table, et elle doit être indexée. MySQL version 3.23 ne fonctionnera correctement que si cette colonne n'accueille que des valeurs positives. Insérer un nombre négatif sera considéré comme insérer un nombre de très grande taille, mais positif. Ceci est fait pour éviter les problèmes de précision lorsque les nombres passe de positif à négatif lorsqu'ils atteignent leur valeur maximale positive. C'est aussi pour éviter qu'une colonne de type AUTO_INCREMENT ne contienne de valeur 0.

    Si vous effacez la ligne contenant la valeur maximale dans la colonne AUTO_INCREMENT , cette valeur sera réutilisée dans les tables de type ISAM mais pas dans les tables de type MyISAM . Si vous effacez toutes les lignes dans la table avec la commande DELETE FROM nom_de_table (sans la clause WHERE) en mode AUTOCOMMIT , la série des valeurs AUTO_INCREMENT recommencera à 0 .

    Avec les tables MyISAM et BDB , vous pouvez spécifier une colonne secondaire d' AUTO_INCREMENT dans une clef multi-colonnes. Utiliser AUTO_INCREMENT .

    Pour rendre MySQL avec certaines applications ODBC , vous pouvez retrouver la valeur de la dernière valeur automatiquement générée avec la requête suivante :

    
    SELECT * FROM nom_de_table WHERE auto_col IS NULL
    
  • Depuis MySQL 4.1, la définition des colonnes peut inclure un attribut CHARACTER SET pour spécifier le jeu de caractères, et éventuellement la collation de la colonne. Pour des détails, voyez Jeux de caractères .
    
    CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
    
    Depuis la version 4.1 aussi, MySQL interprète les spécifications de longueur de colonne en caractères. Les anciennes versions l'interprète comme des octets.
  • La valeur NULL est traitée différemment dans les colonnes de type TIMESTAMP . Vous ne pouvez pas stocker de valeur NULL littérale dans une colonne TIMESTAMP ; insérer une valeur NULL dans une telle colonne revient à insérer la date et l'heure courante. Car les colonnes TIMESTAMP ignorent les attributs NULL et NOT NULL .

    Cela facilite grandement l'utilisation des colonnes TIMESTAMP pour les clients MySQL : le serveur indique que ces colonnes peuvent se voir assigner une valeur NULL (ce qui est vrai), même si les colonnes TIMESTAMP ne contiendront jamais de valeur NULL . Vous pouvez le constater lorsque vous utiliser la commande DESCRIBE nom_de_table pour avoir une description de votre table.

    Notez qu'affecter la valeur 0 à une colonne TIMESTAMP n'est pas la même chose que lui affecter la valeur NULL , car 0 est une valeur TIMESTAMP valide.
  • Une valeur DEFAULT doit être une constante, ça ne peut être une fonction ou une expression. Cela signifie notamment que vous ne pouvez pas donner une valeur par défaut à une colonne de date, le résultat de la fonction NOW() ou CURRENT_DATE .Si aucune valeur par défaut (attribut DEFAULT ) n'est spécifiée, MySQL en assigne une automatiquement

    Si la colonne accepte les valeur NULL , la valeur par défaut sera la valeur NULL .

    Si la colonne est déclarée comme NOT NULL (non-nulle), la valeur par défaut dépendra du type de colonne :
    • Pour les types numériques sans l'attribut AUTO_INCREMENT , la valeur sera 0 . Pour une colonne AUTO_INCREMENT , la valeur par défaut sera la prochaine valeur de la série.
    • Pour les types dates et heures autres que TIMESTAMP , la valeur par défaut est la date zéro appropriée. Pour les colonnes TIMESTAMP , la valeur par défaut est la date et l'heure courante. Types temporels .
    • Pour les types de chaînes autres que ENUM , la valeur par défaut est la chaîne vide. Pour ENUM , la valeur par défaut est la première valeur de l'énumération.
    Les colonnes BLOB et TEXT ne peuvent pas recevoir de valeur par défaut.
  • Un commentaire pour une colonne peut être spécifiée avec COMMENT . Le commentaire est affiché par la commande SHOW CREATE TABLE , et par SHOW FULL COLUMNS . Cette option est disponible depuis MySQL 4.1. Il était autorisé, mais ignoré dans les anciennes versions.
  • Depuis MySQL version 4.1.0, l'attribut SERIAL peut être utilisé comme alias pour les colonnes BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE . C'est une fonctionnalité de compatibilité.
  • KEY est un synonyme de INDEX . Depuis la version 4.1, l'attribut de clé PRIMARY KEY peut aussi être spécifié avec la clause KEY . Il a été implémenté pour assurer la compatibilité avec les autres bases.
  • Avec MySQL, une clé UNIQUE peut avoir uniquement avoir deux valeurs distinctes. Une erreur surviendra si vous essayez d'ajouter une ligne dont la clé correspond à une ligne existante.
  • Une clé primaire ( PRIMARY KEY ) est un index UNIQUE avec la contrainte supplémentaire que les toutes les colonnes utilisées doit avoir l'attribut NOT NULL . En MySQL, cette clé est dite PRIMARY . Une table ne peut avoir qu'une seule clé primaire. Si vous n'avez pas de PRIMARY KEY et que des applications demandent la PRIMARY KEY dans vos tables, MySQL retournera la première clé UNIQUE , qui n'a aucune valeur NULL .
  • Dans une table créée, la clé primaire PRIMARY KEY est placée en première, suivie de tous les index UNIQUE , et enfin, les index non-unique. Cela permet à l'optimiseur MySQL d'utiliser en priorité les index, et de détecter rapidement les doublons pour les clés UNIQUE .
  • Une PRIMARY KEY peut être multi-colonnes. Cependant, vous ne pouvez pas créer d'index multi-colonnes avec l'attribut PRIMARY KEY dans une spécification de colonne. En faisant cela, le seul résultat sera que cette seule colonne sera marquée comme clé primaire. Vous devez absolument utiliser la syntaxe PRIMARY KEY ( index_nom_de_colonne , ...).
  • Si une clé primaire ( PRIMARY ) ou unique ( UNIQUE ) est établit sur une seule colonne, et que cette colonne est de type entier, vous pouvez aussi faire référence à cette colonne sous le nom _rowid (nouveau en version 3.23.11).
  • Avec MySQL, le nom de la clé primaire PRIMARY KEY est PRIMARY . Si vous ne donnez pas de nom à un index, l'index prendra le nom de la première colonne qui le compose, avec éventuellement un suffixe ( _2 , _3 , ...) pour le rendre unique. Vous pouvez voir les noms des index avec la commande SHOW INDEX FROM tbl_name . Syntaxe de SHOW DATABASES .
  • Depuis MySQL 4.1.0, certains moteurs de stockage vous permettent de spécifier un type d'index lors de la création d'un index. La syntaxe de index_type est USING type_name . Les valeurs possibles de type_name qui sont supportées par les différents moteurs de stockages sont listés ci-dessous. Lorsque des index multiples sont listés, le premier rencontré est celui par défaut, si aucun index_type n'est spécifié.
    Moteur de table Types d'index
    MyISAM BTREE
    InnoDB BTREE
    MEMORY/HEAP HASH , BTREE
    Exemple :
    
    CREATE TABLE lookup
        (id INT, INDEX USING BTREE (id))
        ENGINE = MEMORY;
    TYPE type_name peut être utilisé comme synonyme de USING type_name , pour spécifier un type d'index. Cependant, USING est la forme recommandée. De plus, le nom d'index qui précède le type d'index dans la syntaxe de spécification n'est pas optionnelle avec TYPE . Ceci est dû au fait que contrairement à USING , TYPE n'est pas un mot réservé, et donc, il pourrait être interprété comme un nom d'index.Si vous spécifiez un type d'index qui n'est pas légal pour le moteur de stockage, mais qu'il y a un autre type d'index que le moteur peut utiliser sans affecter les résultats de la requête, le moteur utilisera ce type en remplacement.
  • Seuls, les formats de table MyISAM , InnoDB , et BDB supportent des index sur des colonnes qui peuvent contenir des valeurs NULL . Dans les autres situations, vous devez déclarer ces colonnes NOT NULL ou une erreur sera générée.
  • Avec la syntaxe nom_de_colonne(longueur) , vous pouvez spécifier un index qui n'utilise qu'une partie de la colonne CHAR ou VARCHAR . Cela peut réduire la taille des fichiers d'index. Index de colonne .

    Le format de table MyISAM , et depuis la version MySQL 4.0.14, InnoDB , supportent l'indexation des colonnes BLOB et TEXT . Lorsque vous ajoutez un index à une colonne BLOB ou TEXT , vous devez absolument spécifier une longueur d'index :

    
    CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
    
    Le préfixe peut valoir jusqu'à 255 octets de long (où 1000 octets pour les tables MyISAM et InnoDB depuis MySQL 4.1.2). Notez que le préfixe est mesuré en octets, alors que la longueur du préfixe de CREATE TABLE est interprété comme un nombre de caractères. Prenez cela en compte lorsque vous spécifiez une longueur de préfixe pour une colonne dont le jeu de caractères est multi-octets.
  • Une spécification index_col_name peut se terminer avec ASC ou DESC . Ces mots clés sont prévus pour des extensions futures qui permettront un stockage dans un ordre donné. Actuellement, ils sont reconnus mais ignorés : les index sont stockés en ordre ascendant.
  • Lorsque vous utilisez une clause ORDER BY ou GROUP BY sur une colonne de type TEXT ou BLOB , seuls, les max_sort_longueur premiers octets seront lus. Les types BLOB et TEXT .
  • En MySQL version 3.23.23 ou plus récent, vous pouvez aussi créer des index spécial FULLTEXT . Ils sont utilisés pour faire des recherches en texte plein. Seul, le format de table MyISAM supporte les index FULLTEXT . Ils peuvent être créés uniquement pour les colonnes de type VARCHAR et TEXT . L'indexation est alors exécutée sur toute la colonne, et les indexations partielles ne sont pas supportées. Voir Fonctions de recherche en texte plein pour les détails.
  • En MySQL version 4.1 ou plus récent, vous pouvez créer les index spéciaux SPATIAL pour les colonnes géographiques. Les types spatiaux sont supportés par les tables MyISAM , et les colonnes indexées doivent être déclarées comme NOT NULL . Voyez Extensions spatiale de MySQL .
  • En MySQL version 3.23.44 et plus récent, les tables InnoDB supportent la vérification de clé étrangères. Le moteur de tables InnoDB . Notez que la syntaxe des clés étrangères FOREIGN KEY de InnoDB est plus restrictive que la syntaxe présentée ci-dessus. InnoDB ne permet pas la spécification d'un index_name , et les colonnes de la table référencée doivent être explicitement nommées. Depuis la version 4.0.8, InnoDB supporte les clauses ON DELETE et ON UPDATE avec les clés étrangères. Voyez le manuel InnoDB pour la syntaxe précise. Contraintes FOREIGN KEY .Pour les autres types de tables, le serveur MySQL n'analyse pas les clauses FOREIGN KEY , CHECK et REFERENCES dans les commandes CREATE TABLE , et aucune action n'est réalisée. Clés étrangères .
  • Pour les tables MyISAM et ISAM , chaque colonne NULL requiert un bit supplémentaire, arrondi à l'octet supérieur le plus proche.La taille maximale d'enregistrement peut être calculée comme ceci :
    
    row longueur = 1
                 + (somme des longueurs de colonnes)
                 + (nombre de colonnes NULL + 7)/8
                 + (nombre de colonnes à taille variable)
    delete_flag vaut 1 pour les tables avec un format fixe. Les tables à format fixe utilisent un bit dans les lignes pour un marqueur, qui indique si la ligne a été effacée. delete_flag vaut 0 pour les tables à ligne dynamique, car le marquer est stocké dans l'entête de la ligne.Ces calculs ne s'appliquent pas aux tables InnoDB , qui ne font pas la différente entre les colonnes NULL et les colonnes NOT NULL .
Les options options_de_table et SELECT ne sont implémentées que dans MySQL version 3.23 et plus récent.

Les options ENGINE et TYPE spécifie le type de moteur de table. ENGINE a été ajouté en MySQL 4.0.18, pour la série des 4.0 et 4.1.2, pour la série des 4.1. C'est le nom d'attribut recommandé pour ces versions et TYPE est maintenant abandonné. TYPE sera supporté dans les séries 4.x, mais abandonnée probablement en MySQL 5.1.

Les différents types de tables sont :
Table type Description
BDB Tables avec transactions. Tables BDB ou BerkeleyDB .
BerkeleyDB Un alias de BDB .
HEAP Les données de ces tables ne sont stockées qu'en mémoire. Tables HEAP .
ISAM Le gestionnaire originel de tables. Tables ISAM .
InnoDB Tables transactionnelles avec verrou de lignes. Le moteur de tables InnoDB .
MEMORY Un alias de HEAP . (En fait, depuis MySQL 4.1, MEMORY est le terme recommandé.)
MERGE Un ensemble de tables MyISAM utilisées comme une seule et même table. Tables MERGE .
MRG_MyISAM Un synonyme pour MERGE les tables.
MyISAM Le nouveau gestionnaire de table binaire et portable. Tables MyISAM .
Types de tables MySQL .

Si un type de table est demandé, mais que ce type particulier n'est pas disponible, MySQL va choisir le type de table le plus proche de celui qui est spécifié. Par exemple, si TYPE=BDB est spécifié, et que la distribution de MySQL ne supporte pas les tables BDB , la table qui sera créée sera du type MyISAM .

Les autres options de tables sont utilisées pour optimiser le comportement de la table. Dans la plupart des cas, vous n'avez pas à les spécifier. Les options fonctionnent pour tous les types de tables (sauf contre-indication) :
    AUTO_INCREMENT
    La prochaine valeur AUTO_INCREMENT de votre table ( MyISAM ). Ne fonctionne que pour les tables MyISAM . Pour donner la première valeur à une colonne AUTO_INCREMENT InnoDB , insérez une ligne bidon, avec la valeur désirée moins un, puis supprimez la ligne.
    AVG_ROW_LENGTH
    La taille moyenne approchée des lignes de votre table. Vous ne devez fournir cette valeur que pour les tables à taille de ligne variable, de très grande taille.

    Lorsque vous créer une table MyISAM , MySQL utilise le produit des options MAX_ROWS et AVG_ROW_LENGTH pour décider de la taille du résultat. Si vous ne spécifiez aucune option, la taille maximale de la table sera de 4 Go (ou 2 Go si votre système d'exploitation ne supporte que les tables de 2 Go). Ceci sert à conserver la taille des pointeurs d'index petite, et rapide, si nous n'avez pas besoin de gros fichiers. Si vous voulez que vos tables dépassent 4 Go de taille, et que vous voulez garder les tables petites taille un peu plus lentes et grosses que nécessaire, vous pouvez augmenter la taille du pointeur d'index en modifiant la variable système globale myisam_data_pointer_size , qui a été ajoutée en MySQL 4.1.2. Variables sytème du serveur .

    CHECKSUM
    Passez 1 si vous voulez que MySQL génère une somme de vérification (ce qui facilite la recherche des lignes corrompues, mais ralentit les mises à jour). La commande CHECKSUM TABLE rapporte cette somme. MyISAM uniquement.
    COMMENT
    Un commentaire pour votre table (60 caractères).
    MAX_ROWS
    Nombre de lignes maximum que vous pensez stocker dans la table.
    MIN_ROWS
    Nombre de minimum lignes que vous pensez stocker dans la table.
    PACK_KEYS
    Spécifiez 1 si vous voulez un index plus compact. Généralement cela rend les mises à jour plus lentes, mais les lectures plus rapides.

    Spécifier la valeur de 0 désactive tout le compactage de clé. Spécifier la valeur DEFAULT (MySQL 4.0) indique au moteur de stockage de ne stocker que les colonnes CHAR / VARCHAR . ( MyISAM et ISAM uniquement)

    Si vous n'utilisez pas PACK_KEYS , le comportement par défaut est de ne stocker que les chaînes, et non pas les nombres. Si vous utilisez PACK_KEYS=1 , les nombres seront aussi compactés.

    Lors du compactage, MySQL utilise une compression de préfixe :

      Chaque clé requiert un octet de plus pour indiquer combien d'octets sont identiques dans la clé précédente.
      Le pointeur de ligne est stocké au format grand-octet-en-premier, directement après la clé, pour améliorer la compression.

    Cela signifie que si vous avez de nombreuses clés proches sur des lignes consécutives, les clés successives ``identiques'' ne prendront généralement que deux octets (incluant le pointeur de ligne). Comparez cela à la situation ordinaire, où les clés successives occupent taille_de_cle + taille_de_pointeur (où la taille du pointeur est généralement de 4). En conséquence, vous tirerez le meilleur parti de cette compression si vous avez plusieurs nombres identiques. Si toutes les clés sont totalement différentes, vous utiliserez un octet de plus par clé, si la clé n'accepte pas les valeurs NULL . Dans ce cas, la taille de la clé sera stockée dans le même octet que celui qui indique que la clé est NULL .)

    PASSWORD
    Chiffre le fichier .frm avec un mot de passe. Cette option ne fait rien du tout pour la version standard de MySQL.
    DELAY_KEY_WRITE
    Spécifiez 1 si vous voulez attendre la fermeture de la table pour mettre à jour les index. MyISAM uniquement.
    ROW_FORMAT
    Définit la méthode de stockage des lignes (réservé pour le futur). Actuellement, cette option fonctionne uniquement avec des tables MyISAM qui supportent le DYNAMIC et FIXED en format de ligne. Format de table MyISAM .
    RAID_TYPE
    L'option RAID_TYPE vous permet de dépasser la limite de 2 Go/4 Go de votre fichier de données MyISAM (mais pas le fichier d'index), pour les systèmes d'exploitation qui ne supportent pas les grands fichiers. Cette option n'est pas recommandée pour les systèmes d'exploitation qui supportent les grands fichiers.Vous pouvez réduire les ralentissements d'E/S en plaçant les dossiers RAID sur différents disques physiques. Actuellement, le seul type RAID_TYPE est STRIPED . 1 et RAID0 sont des alias de STRIPED .

    Si vous spécifiez l'option RAID_TYPE pour une table MyISAM , spécifiez les options RAID_CHUNKS et RAID_CHUNKSIZE en même temps. La valeur maximale de RAID_CHUNKS est 255. MyISAM va créer RAID_CHUNKS sous-dossiers appelés 00 , 01 , 02 , ... 09 , 0a , 0b , ... dans le dossier de données. Dans chaque dossier, MyISAM va créer un fichier tbl_name.MYD . Lors de l'écriture dans le fichier de données, le gestionnaire RAID place les RAID_CHUNKSIZE*1024 premiers octets dans le premier fichier, les seconds RAID_CHUNKSIZE*1024 octets dans le fichier suivant, etc.

    RAID_TYPE fonctionne sur tous les systèmes d'exploitation, tant que vous avez compilé MySQL avec --with-raid , avec le script configure . Pour déterminer si votre serveur a le support des tables RAID , utilisez SHOW VARIABLES LIKE 'have_raid' pour voir si sa valeur vaut YES .
    UNION
    UNION sert lorsque vous voulez que plusieurs tables identiques se comporte comme une seule table. Cela fonctionne avec les tables MERGE . Tables MERGE .Pour le moment, vous devez avoir les droits de SELECT , UPDATE et DELETE pour les tables intégrées dans la table MERGE . Originalement, toutes les tables utilisées devaient être dans la même base de données, que la table MERGE . Cette restriction a été levée depuis MySQL 4.1.1.
    INSERT_METHOD
    Si vous voulez insérer des données dans une table MERGE , vous devez spécifier la table d'insertion avec l'attribut INSERT_METHOD . L'option INSERT_METHOD est utilisée uniquement avec les tables MERGE . Cette option a été introduite en MySQL 4.0.0. Tables MERGE .
    DATA DIRECTORY
    INDEX DIRECTORY
    En utilisant DATA DIRECTORY='directory' ou INDEX DIRECTORY='directory' , vous pouvez spécifier où le moteur de stockage MyISAM doit placer les données de la table et le fichier d'index. Notez que vous devez donner un chemin absolu, et non un chemin relatif.

    Ces options ne fonctionnent que pour les tables MyISAM depuis MySQL 4.0, lorsque vous n'utilisez pas l'option --skip-symlink . Votre système d'exploitation doit aussi disposer d'une fonction realpath() compatible avec les threads. Utiliser les liens symboliques pour les tables sous Unix .

Depuis MySQL 3.23, vous pouvez créer une table à partir d'une autre, en ajoutant une commande SELECT après la commande CREATE TABLE :


CREATE TABLE new_tbl SELECT * FROM orig_tbl;
MySQL va créer une nouvelle colonne pour chaque colonne de résultat de la commande SELECT . Par exemple :

mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
    ->        PRIMARY KEY (a), KEY(b))
    ->        TYPE=MyISAM SELECT b,c FROM test2;
Cela créer une table MyISAM avec trois colonnes a , b , et c . Notez que les colonnes de la commande SELECT sont ajoutées à droite de la table, et non dans la liste des colonnes. Par exemple :

mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+

mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM bar;
+------+---+
| m    | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)
Pour chaque ligne de la table foo , une ligne est insérée dans la colonne bar avec la valeur issue de foo et la valeur par défaut pour les nouvelles colonnes.

Si une erreur survient durant la copie de la table, la table est automatiquement effacée.

CREATE TABLE ... SELECT ne va pas créer automatiquement les index pour vous. Ceci est fait intentionnellement pour rendre la commande aussi souple que possible. Si vous voulez avoir les mêmes index, vous devez les spécifier dans la commande avant le SELECT :

mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Certaines conversions de type pourraient avoir lieu. Par exemple, l'attribut AUTO_INCREMENT n'est pas préservé, et les colonnes VARCHAR peuvent devenir des colonnes CHAR .Lors de la création de la table avec CREATE ... SELECT , assurez vous de mettre un nom d'alias à toutes les fonctions ou expression de la requête. Si vous ne le faîtes pas, la commande CREATE peut échouer ou donner des noms de colonnes inattendus.

CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;
Depuis MySQL 4.1, vous pouvez spécifier explicitement le type de colonne généré :

CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
En MySQL 4.1, vous pouvez aussi utiliser la clause LIKE pour créer une table basée sur la définition d'une autre table, y compris les attributs de colonnes et les index originaux :

CREATE TABLE new_tbl LIKE orig_tbl;
CREATE TABLE ... LIKE ne copie pas les options de tables DATA DIRECTORY et INDEX DIRECTORY qui étaient spécifiées dans la table originale.Vous pouvez faire précéder SELECT par IGNORE ou REPLACE pour indiquer comment gérer les clés doublons. Avec IGNORE , les nouvelles lignes qui sont en double seront ignorés. Avec REPLACE , les nouvelles lignes remplaceront les lignes précédentes, qui avaient la même valeur d'index. Si ni IGNORE , ni REPLACE ne sont spécifié, les doublons génèreront une erreur.

Pour s'assurer que le log binaire peut être réutilisé pour recréer la table originale, MySQL ne permettra pas les insertions concurrentes durant une commande CREATE TABLE ... SELECT .

Sommaire :

<< Syntaxe de CREATE TABLE >>
Syntaxe de CREATE INDEX Définition de données : CREATE , DROP , ALTER Syntaxe de DROP DATABASE