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 :
|