CREATE [TEMPORARY] TABLE [IF NOT EXISTS] Nom_table (create_definition,...)
[options_de_table] [commande_de_selection]
create_definition:
Nom_col type [NOT NULL | NULL] [DEFAULT valeur_par_defaut] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
ou PRIMARY KEY (index_Nom_col,...)
ou KEY [Nom_index] KEY(index_Nom_col,...)
ou INDEX [Nom_index] (index_Nom_col,...)
ou UNIQUE [INDEX] [Nom_index] (index_Nom_col,...)
ou [CONSTRAINT symbole] FOREIGN KEY Nom_index(index_Nom_col,...)
[reference_definition]
ou CHECK (expression )
type:
TINYINT[(longueur)] [UNSIGNED] [ZEROFILL]
ou SMALLINT[(longueur)] [UNSIGNED] [ZEROFILL]
ou MEDIUMINT[(longueur)] [UNSIGNED] [ZEROFILL]
ou INT[(longueur)] [UNSIGNED] [ZEROFILL]
ou INTEGER[(longueur)] [UNSIGNED] [ZEROFILL]
ou BIGINT[(longueur)] [UNSIGNED] [ZEROFILL]
ou REAL[(longueur,décimales)] [UNSIGNED] [ZEROFILL]
ou DOUBLE[(longueur,décimales)] [UNSIGNED] [ZEROFILL]
ou FLOAT[(longueur,décimales)] [UNSIGNED] [ZEROFILL]
ou DECIMAL(longueur,décimales) [UNSIGNED] [ZEROFILL]
ou NUMERIC(longueur,décimales) [UNSIGNED] [ZEROFILL]
ou CHAR(longueur) [BINARY]
ou VARCHAR(longueur) [BINARY]
ou DATE
ou TIME
ou TIMESTAMP
ou DATETIME
ou TINYBLOB
ou BLOB
ou MEDIUMBLOB
ou LONGBLOB
ou TINYTEXT
ou TEXT
ou MEDIUMTEXT
ou LONGTEXT
ou ENUM(value1,value2,value3,...)
ou SET(value1,value2,value3,...)
index_Nom_col:
Nom_col [(longueur)]
reference_definition:
REFERENCES Nom_table [(index_Nom_col,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
options_de_table:
type = [ISAM | MYISAM | HEAP]
ouauto_increment = #
ouavg_row_longueur = #
ouchecksum = [0 | 1]
oucomment = "string"
oulignes_max= #
oulignes_min = #
oupack_keys = [0 | 1]
oupassword= "string"
commande_de_selection:
[ | IGNORE | REPLACE] SELECT ... (Un select valide)
CREATE TABLE
crée une table, de nom Nom_table, dans la base de donnés courante. Les règles qui régissent les nom de table sont détaillées dans 7.1.5 Noms de base de données, table, index, column et alias. MySQL retourne une erreur si il n'y a pas de base de données courante, ou la table existe déjà.
Avec MySQL 3.22 ou plus récent, on peut se référer à la table en utilisant la structure Nom_bdd.Nom_table
. Ceci fonctionne, qu'il y ait une base de données courante ou pas.
MySQL 3.23 autorise l'utilisation du mot clé TEMPORARY
lors de la création de table. Une table temporaire sera automatiquement effacée lorsque la connexion sera terminée. Cela permet à deux connexions différents d'utiliser le même nom de table temporaire, sans conflit l'un avec l'autre, ou avec une table existante (la table permanente est cachée jusqu'à ce que la table temporaire soit effacée).
MySQL 3.22 ou plus récent autorise l'utilisation du mot clé IF NOT EXISTS
, qui ne retourne pas d'erreur si la table à créer existe déjà.
Chaque table est representée par un ou plusieurs fichiers dans le dossier de la bas e de données. Dans le cas ou la table est de type ISAM, il y aura :
Pour plus d'information sur les propriétés des différents type de colonne, 7.2 Types de colonnes.
- Si ni
NULL
ni NOT NULL
n'a été précisé, alors la colonne est considéré comme de type NULL.
- Une colonne de type entier peut avoir l'attribut
AUTO_INCREMENT
. A chaque insertion de la valeur ou de 0 dans une colonne de type AUTO_INCREMENT
, la valeur de la colonne est mise à value+1
, avec value
qui est la plus grande valeur dans la colonne de la table courante. AUTO_INCREMENT
commence à 1. Si la ligne contenant la plus grande valeur de la colonne est effacée, cette valeur sera réutilisée. Si toutes les lignes de la table sont effacée, AUTO_INCREMENT
recommence à 1. Il ne peux y avoir qu'une seule colonne de type AUTO_INCREMENT
par table, et cette colonne doit être indexée. Par souci de compatibilité avec ODBC, il est possible d'accéder à la dernière ligne insérée avec la requête suivante :
SELECT * FROM Nom_table WHERE auto_col IS NULL
Les valeurs NULL
sont gérées de manière différentes pour les colonnes de type TIMESTAMP. Il n'est pas possible de stocker la valeur NULL
dans une colonne de type TIMESTAMP, alors cette affectation conduit à affecter la date et l'heure courante à la place. A cause de ce comportement, les attributs NULL
et NOT NULL ne s'appliquent pas, et sont ignorées. D'un autre coté, afin de rendre
MySQL plus simple à utiliser, le serveur autorise l'affectation de NULL
aux colonnes de type TIMESTAMP
(ce qui est vrai), même si les colonnes de type TIMESTAMP
ne contiendront jamais réellement la valeur NULL. Cette information est accessible en utilisant la commande DESCRIBE Nom_table
qui détaille les colonnes de la table. Il est bon de rappeler que la valeur 0
est une valeur valide de TIMESTAMP
.
Si aucune valeur par défaut n'est précisé avec l'attribut DEFAULT,
MySQL en assignera automatiquement une. Si la colonne peut prendre la valeur NULL, alors
MySQL utilisera cette valeur par défaut. Sinon, son comportement dépendra du type de colonne :
- Pour les types numériques autres que ceux ayant l'attribut
AUTO_INCREMENT
, la valeur par défaut est 0
. Pour les colonnes ayant l'attribut AUTO_INCREMENT
, la valeur par défaut est la prochaine valeur de la séquence.
- Pour les types date et heures, excepté
TIMESTAMP
, la valeur par défaut est le ``zéro'' . Pour la première colonne de type TIMESTAMP
, la valeur par défaut est la date et l'heure courante. 7.2.6 Types date et heure.
- Pour les types chaînes, autre que
ENUM
, la valeur par défaut est la chaîne vide. Pour le type ENUM
, la valeur par défaut est la première valeur de l'énumération.
KEY
est un synonyme pour INDEX
.
- Avec MySQL, l'attribut
UNIQUE
force la valeur à toujours prendre une valeur distincte. Une erreur surviendra lors de l'insertion d'une ligne qui doublera une ligne déjà existante.
- Avec MySQL, l'attribut
PRIMARY KEY
est identique à l'attribut KEY
qui porterait le nom de PRIMARY
Une table ne peut avoir qu'une seule colonne avec l'attribut table PRIMARY KEY
. Si aucune colonne n'a de PRIMARY KEY
et qu'une application requiert la colonne de PRIMARY KEY
, MySQL retournera la première colonne ayant l'attribut UNIQUE.
- Une
PRIMARY KEY
peut être un index multi colonne. Mais il n'est pas possible de créer un index multi colonne qui aurait l'attribut PRIMARY KEY
. Pour cela, il faut utiliser la fonction PRIMARY KEY(index_Nom_col, ...)
, sous peine de ne voir que la première colonne porter l'attribut PRIMARY KEY
.
- Si aucun nom n'est affecté à un index, un nom sera automatiquement généré et assigné. Ce nom sera constitué du nom de la première colonne, avec un suffixe optionnel,(
_2
, _3
, ...
), pour l rendre unique. La liste des noms d'index est accessible avec la requête : SHOW INDEX FROM Nom_table.
- Seule les tables de type MyISAM acceptent les index sur les colonnes qui contiennent la valeur
NULL
. Dans les autres cas, il faut absolument déclarer la colonne de type NOT NULL
pour ne pas générer une erreur.
- Avec la syntaxe
Nom_col(longueur)
, il est possible de spécifier un index qui utilise seulement une partie de la colonne de type CHAR
or VARCHAR
. Cela rend l'index nettement plus petit et plus efficace. Indexes
.
- Seules les tables de type MyISAM acceptent d'indexer les colonnes de type
BLOB
et TEXT
. mettre un index sur une telle colonne impose de préciser la longueur de la colonne dans l'index.
CREATE TABLE test (blob_col BLOB, index(blob_col(10)));
- Lors de l'utilisation des clauses
ORDER BY
ou GROUP BY
avec de colonnes de type TEXT
ou BLOB
, seuls les max_sort_longueur
premiers octets sont pris en compte. BLOB
.
- Les attributs
FOREIGN KEY
, CHECK
et REFERENCES
ne font en réalité rien de spécial. Ils sont uniquement fournis pour assurer la compatibilité et la portabilité de programme SQL et de les faire tourner avec MySQL.
- Les colonnes de type prennent un bit de plus, arrondi à l'octet le plus proche.
- La taille maximale d'un enregistrement peut être obtenue avec la requête suivante :
row longueur = 1
+ (sum of column longueurs)
+ (number of NULL columns + 7)/8
+ (number of variable-longueur columns)
- Les options
options_de_table
et SELECT
ne sont disponibles qu'à partir de MySQL 3.23. Les différents types de tables sont :
Les options de table sont utilisées pour optimiser la gestion de la table. Dans la plus part des cas, ces options peuvent être ignorées. Ces options fonctionnent pour toutes les types de table, sauf indication contraire.
Lors de l'utilisation d'une tape de type MyISAM
table, MySQL utilise le produit max* avg_row_longueur
pour connaître la taille maximale de la table. Par défaut, la taille maximale de la table est 4Go (4 Giga octets) (ou 2Go, si le système ne les supporte pas.
- Si un
CREATE STATEMENT
est spécifié après SELECT,
MySQL va créer de nouveaux champs pour chacun des éléments dans le SELECT
. Par exemple
mysql> CREATE TABLE test (a int not null auto_increment, primary key (a), key(b))
TYPE=HEAP SELECT b,c from test2;
Cette requête va créer une table de type HEAP
table avec 3 colonnes. Cette table sera automatiquement effacée si une erreur survient lors de la copie des données dans ma table.
Dans certains cas, MySQL spontanément les spécifications d'une colonne lors d'une commande de CREATE TABLE
(Cela peut aussi intervenir lors d'une commande with ALTER TABLE
.)
- Les colonnes de type
VARCHAR
d'une longueur de moins de 4 caractères sont changées en CHAR
.
- Si l'une des colonne de la table a une longueur variable, alors la ligne complète a aussi une longueur variable. Par conséquent, si la table contient une colonne de longueur variable(
VARCHAR
, TEXT
or BLOB
), toutes les colonnes de type CHAR
et de longueur supérieur à 3 caractères sont changées en colonne de type VARCHAR
.Cela ne change en rien l'utilisation de ces colonnes, cela modifie simplement la façon dont les colonnes sont stockées. MySQL effectue cette conversion car cela économise de la place, et rend les opérations sur la table plus rapides.
- La taille d'affichage des colonnes de type
TIMESTAMP
doit être pair et compris dans l'intervalle de 2 à 14. En dehors de l'intervalle 2 à 14, la taille de l'affichage est ramenée à 14. En cas de nombre impair, le nombre est arrondi au nombre pair directement supérieur.
- Il est impossible d'enregistrer une valeur
NULL
dans une colonne de type TIMESTAMP
, car une telle affectation revient à assigner la date et l'heure courante à la colonne. De ce fait, les attributs NULL
et NOT NULL
ne s'appliquent pas aux colonnes de type TIMESTAMP
, et sont ignorés. Lors d'une requête DESCRIBE Nom_table
MySQL répondra toujours que la colonne accepte les valeurs de type NULL
.
- MySQL effectue la correspondance entre certains types utilisé par d'autres bases de données SQL vers des types MySQL. 7.2.11 Utiliser des types de colonnes d'autres bases de données.
Pour savoir si MySQL a modifié spontanément le type d'une colonne, il faut utiliser la requête DESCRIBE Nom_table
après la création ou la modification de la table.
Certaines autres modifications de type peuvent intervenir lors de la compression de table avec la commande pack_isam
.
10.17 Quel sont les différents formats de lignes? Quand utiliser VARCHAR/CHAR
?.