CREATE TABLE |
Crée la table |
---|---|
MySQL |
Syntaxe
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nomtable [(definition1,definition2,...)] [optionselection] [clause SELECT] |
Paramètres
Nom | Description |
---|---|
nomtable | Ce paramètre permet d'indiquer le nom de la table dans la base de données. |
definition1,definition2,... | Ce paramètre permet d'indiquer le nom du champ, le type de données et les attributs d'un champ de la table de base de données. |
optionselection | Ce paramètre permet d'indiquer les options de sélections, soit le type de police de caractères par défaut,.... |
clause | Ce paramètre permet d'indiquer une clause associé à cette table de base de données. |
Description
Cette instruction permet de créer une table dans la base de données spécifié ou courante.
Remarques
- Il est préférable d'utiliser une clef primaire (id int PRIMARY KEY) afin qu'il y ait un identificateur permettant de retrouver rapidement un enregistrement dans la table.
- Une clef primaire ne peut pas être d'un type de données NULL, elle doit obligatoirement être «NOT NULL».
- Il est préférable d'utiliser une clef primaire utilisant un type de données entier, car la recherche est plus rapide qu'avec une chaîne de caractères, par exemple, et de plus, il y a moins de risque que cet identificateur soit interpréter quand vous les passer comme paramètre URL (escape du JavaScript, urlencode du PHP, UrlEncode de SAS,...) par exemple, contrairement au symbole.
- L'utilisation d'un index (CREATE INDEX) sur un champ précisé permet de retrouver plus rapidement les informations d'une table et permet également de trier (SELECT ... ORDER BY) plus rapidement avec le champ contenant un index.
- Si vous n'êtes pas obligé d'avoir une clef unique pour toute la base de données (de style ISO ou UUID), vous devriez utiliser l'attribut «AUTO_INCREMENT» plutôt qu'un «SELECT MAX(id)+1 AS NextKey FROM table» pour connaitre votre prochain identificateur de clef primaire, car il n'y a pas de risque que votre identificateur soit pris par un autre processus roulant simultanément et de recevoir un message d'erreur «Duplicate row».
- Si vous devez créer une relation N:N entre deux tables, soit vous créer une table intermédiaire avec des clefs étrangères comme ceci :
- CREATE TABLE table1table2_relation (
- idTable1 INT,
- idTable2 INT,
- FOREIGN KEY (idTable1) REFERENCES table1(idTable1),
- FOREIGN KEY (idTable2) REFERENCES table1(idTable2)
- );
- CREATE TABLE project_relation (
- sourceId int(11) NOT NULL,
- sourceTable varchar(20) NOT NULL,
- targetId int(11) NOT NULL,
- targetTable varchar(20) NOT NULL,
- PRIMARY KEY (sourceId,sourceTable,targetId,targetTable)
- );
- FOREIGN KEY et suppression : Si vous ne pouvez pas utiliser de «FOREIGN KEY» pour créer des relations entre vos tables, vous n'aurez d'autres choix que de créer un champ «deleted» dont vous mettrez à la valeur 0 par défaut et lorsque vous supprimerez un enregistrement d'un table, vous fixerez la valeur 1 au champ «deleted» plutôt que de vraiment supprimer le champ. Cette technique était utiliser dans les bases de données dBase.
ou que vous créez une table centralisée pour tout le projet avec la relation de table associé :
Lequel des deux systèmes est le meilleur ? La première consommera moins d'espace, mais augmentera le nombre de tables nécessaires au système tandis que le second réduira de façon significative le nombre de tables, mais occupera plus d'espace disque. Suivant se genre d'idée, il peut également être préférable d'utiliser une énumération (ENUM) de chaine de caractères plutôt qu'une chaine de caractères (VARCHAR), car les performances seront meilleures et la table sera beaucoup plus petite. Normalement, les énumérations sont déconseillés (voir Les raisons pour lesquelles le type de données «ENUM» MySQL est une mauvaise pratique), mais dans cette situation très particulière, elles sont bénéfiques (voir Agrégation de table : Toutes les relations étrangères dans la même table versus une table pour chacune des relations ?).
Exemple
L'exemple suivant permet de créer la table ou de l'écraser si elle existe et d'insérer des données dans celle-ci immédiatement après :
- DROP TABLE IF EXISTS `cdmworkgroup`;
-
- CREATE TABLE `cdmworkgroup` (
- `Cin` char(3) DEFAULT NULL,
- `WorkGroupId` int(11) NOT NULL,
- `Name_EN` varchar(255) DEFAULT NULL,
- `Name_FR` varchar(255) DEFAULT NULL,
- `Description` text,
- `Status` char(1) DEFAULT NULL,
- `CreateDate` date DEFAULT NULL,
- `CreateUserId` char(11) DEFAULT NULL,
- `LastUpdate` date DEFAULT NULL,
- `UpdateUserId` char(11) DEFAULT NULL,
- PRIMARY KEY (`WorkGroupId`)
- );
-
- INSERT INTO `cdmworkgroup`(`Cin`,`WorkGroupId`,`Name_EN`,`Name_FR`,`Description`,`Status`,`CreateDate`,`CreateUserId`,`LastUpdate`,`UpdateUserId`) values ('075',68,'Test','Teste','Groupe désigné pour le contrôle de la Qualité','A','2006-03-09','STREMBLAY','2006-03-09','STREMBLAY'),('000',23901,'Coder','Développement','Groupe de programmeur effectuant de la recherche et développement (R&D).','A','2006-03-09','SYSADM','2006-03-09','SYSADM'),('000',23902,'Maintenance','Maintenance',"Groupe maintenant les divers services réseaux, implantant les développements, maintenant l\'état actuel du matériel et administratant les accès.",'A','2006-03-09','SYSADM','2006-03-09','SYSADM'),('000',23903,'Direction','Direction',"Direction Groupe de travail s'occupant des divers orientations à prendre sur les projets et les produits.",'I','2006-03-09','SYSADM','2006-03-09','SYSADM');
Voir également
Article - Les géants de l'informatique - Oracle
Références
MySQL - Référence, Edition Micro Application, Nicolas Rivereau, Antoine Pichot, 2002, ISBN: 2-7429-2560-0, page 901.
MySQL: The definitive guide to using, programming, and administering MySQL 4 databases - Second Edition, Paul Dubois, 2003, ISBN: 0-7357-1212-3, page 854