6. SQL intégré

publicité
Langage MySQL
Chapitre 1
LDD
1
Table des matières
1.
2.
3.
4.
5.
6.
7.
Introduction .................................................................................................................................................................................. 3
Langage de définition de données ................................................................................................................................................. 3
Langage de manipulation de données ........................................................................................................................................... 3
Langage de protections d'accès ..................................................................................................................................................... 3
Langage de contrôle de transaction ............................................................................................................................................... 4
SQL intégré................................................................................................................................................................................... 4
Création d'une table (CREATE) ............................................................................................................................................. 6
7.1.
*create_definition:.............................................................................................................................................................. 6
7.2.
Les identificateurs MySQL de col_name ........................................................................................................................... 6
7.2.1.
Règles générales ...................................................................................................................................................... 6
les mots-clés SQL sont les suivants : ............................................................................................................................................ 7
7.2.2.
Tables et colonnes (champs) .................................................................................................................................... 8
7.3.
Types de données de col_name .......................................................................................................................................... 8
7.3.1.
Strings – chaîne de caractères : ................................................................................................................................ 9
7.3.2.
Attributs à option (dans le tableau suivant).............................................................................................................. 9
7.3.3.
Paramètres à option (dans le tableau suivant) .......................................................................................................... 9
7.3.4.
La valeur NULL ...................................................................................................................................................... 9
7.3.5.
Tableau récapitulatif des types ................................................................................................................................. 9
8.
Contraintes d'intégrités .......................................................................................................................................................... 11
8.2.
Syntaxe ............................................................................................................................................................................. 11
8.3.
NOT NULL ou NULL : ................................................................................................................................................ 12
8.4.
UNIQUE : .................................................................................................................................................................... 12
8.5.
PRIMARY KEY : ........................................................................................................................................................ 12
8.6.
REFERENCES table [(colonne)] [ON DELETE CASCADE] : ................................................................ 13
8.7.
CHECK (condition) : .......................................................................................................................................... 13
8.8.
DEFAULT valeur : ................................................................................................................................................. 13
8.9.
ON DELETE CASCADE : .......................................................................................................................................... 13
8.10.
ON DELETE SET NULL : .................................................................................................................................. 13
8.11.
EXEMPLE .................................................................................................................................................................. 13
9.
DESCRIBE ...................................................................................................................................................................... 14
9.1.
Syntaxe de DESCRIBE .................................................................................................................................................... 15
10.
détruire une table (DROP TABLE) ................................................................................................................................. 16
10.1.
Syntaxe de DROP TABLE ............................................................................................................................. 16
11.
renommer une table (RENAME TABLE) ......................................................................................................................... 16
11.1.
Syntaxe de RENAME TABLE ..................................................................................................................................... 16
Modifier une table ALTER TABLE ..................................................................................................................................................... 17
12.
ANALYZE TABLE ..................................................................................................................................................... 21
12.1.
Syntaxe de ANALYZE TABLE ................................................................................................................................... 21
13.
TRUNCATE ................................................................................................................................................................. 21
13.1.
Description ..................................................................................................................................................... 21
13.2.
Syntaxe ....................................................................................................................................................................... 22
13.3.
Utilisation ................................................................................................................................................................... 22
13.4.
Autorisations ............................................................................................................................................................... 22
2
1. INTRODUCTION
Les instructions SQL sont regroupées en catégories en fonction de leur utilité et des entités
manipulées. Nous pouvons distinguer cinq catégories, qui permettent :
1. la définition des éléments d'une base de données (tables, colonnes, clefs, index,
contraintes, ...),
2. la manipulation des données (insertion, suppression, modification, extraction, ...),
3. la gestion des droits d'accès aux données (acquisition et révocation des droits),
4. la gestion des transactions,
5. et enfin le SQL intégré.
2. LANGAGE DE DEFINITION DE DONNEES
Le langage de définition de données (LDD, ou Data Definition Language, soit DDL en anglais)
est un langage orienté au niveau de la structure de la base de données. Le LDD permet de créer,
modifier, supprimer des objets. Il permet également de définir le domaine des données (nombre,
chaîne de caractères, date, booléen, ...) et d'ajouter des contraintes de valeur sur les données. Il
permet enfin d'autoriser ou d'interdire l'accès aux données et d'activer ou de désactiver l'audit
pour un utilisateur donné.
Les instructions du LDD sont : CREATE, ALTER, DROP, AUDIT, NOAUDIT, ANALYZE,
RENAME, TRUNCATE.
3. LANGAGE DE MANIPULATION DE DONNEES
Le langage de manipulation de données (LMD, ou Data Manipulation Language, soit DML en
anglais) est l'ensemble des commandes concernant la manipulation des données dans une base de
données. Le LMD permet l'ajout, la suppression et la modification de lignes, la visualisation du
contenu des tables et leur verrouillage.
Les instructions du LMD sont : INSERT, UPDATE, DELETE, SELECT, EXPLAIN, PLAN,
LOCK TABLE.
Ces éléments doivent être validés par une transaction pour qu'ils soient pris en compte.
4. LANGAGE DE PROTECTIONS D'ACCES
Le langage de protections d'accès (ou Data Control Language, soit DCL en anglais) s'occupe
de gérer les droits d'accès aux tables.
Les instructions du DCL sont : GRANT, REVOKE.
3
5. LANGAGE DE CONTROLE DE TRANSACTION
Le langage de contrôle de transaction (ou Transaction Control Language, soit TCL en anglais)
gère les modifications faites par le LMD, c'est-à-dire les caractéristiques des transactions et la
validation et l'annulation des modifications.
Les instructions du TCL sont : COMMIT, SAVEPOINT, ROLLBACK, SET TRANSACTION
6. SQL INTEGRE
Le SQL intégré (Embedded SQL) permet d'utiliser SQL dans un langage de troisième génération
(C, Java, Cobol, php, etc.) :




déclaration d'objets ou d'instructions ;
exécution d'instructions ;
gestion des variables et des curseurs ;
traitement des erreurs.
Les instructions du SQL intégré sont : DECLARE, TYPE, DESCRIBE, VAR, CONNECT,
PREPARE, EXECUTE, OPEN, FETCH, CLOSE, WHENEVER.
4
Définition de données (LDD)
Les instructions du LDD sont : CREATE, ALTER, DROP, ANALYZE, RENAME,
TRUNCATE.
On va s'appuyer sur l'exemple du cinéma :
selon les règles du passage du MCD au MLD on a les tables suivantes :
selon la règle I :
SALLE_CINEMA( nom_salle , adresse )
FILM ( visa , titre, realisateur , année_sortie )
SPECTATEUR ( numero, nom , prenom , adresse , date_naissance , cat_prof )
la règle II
APPRECIATION ( visa , numero , impression )
SALLE_CINEMA( nom_salle , adresse , visa)
en définitif on aura 4 tables pour le cinéma :
5
FILM ( visa , titre, realisateur , année_sortie )
SPECTATEUR ( numero, nom , prenom , adresse , date_naissance , cat_prof )
APPRECIATION ( visa , numero , impression )
SALLE_CINEMA( nom_salle , adresse , visa)
7. CREATION D'UNE TABLE (CREATE)
La création d'une table implique:




lui donner un nom (dans une base de données)
définir des colonnes (attributs ) : nom , type, taille, valeurs par défaut, ...
ajouter des contraintes pour les colonnes si nécessaire,
donner éventuellement des permissions (grants)
dans ce qui suit : les indications entre crochet sont facultatifs.
les commandes Mysql peuvent être écrites en majuscules ou minuscules.
la syntaxe (voir plus loin pour les explications):
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition*,...)
[table_options] [select_statement]
7.1.
*create_definition:
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
or PRIMARY KEY (index_col_name,...)
or KEY [index_name] KEY(index_col_name,...)
or INDEX [index_name] (index_col_name,...)
or UNIQUE [INDEX] [index_name] (index_col_name,...)
or [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
[reference_definition]
or CHECK (expr)
7.2.
Les identificateurs MySQL de col_name
7.2.1. Règles générales

utilisés pour: noms de bases de données , tables, colonnes, etc.
6





Taille: mots de 30 caractères max;
Caractères autorisés: lettres, chiffres, #, $, _ (le premier char doit être une lettre) ;
pas de distinction entre minuscules et majuscules;
(sauf pour les bases de données et tables dans MySQL sous Unix !!)
PAS d'accents !
PAS de mots clefs (SELECT, WHERE, .....) voir la liste ci-dessous :
les mots-clés SQL sont les suivants :
Mot réservé
add
any
begin
bit
call
cast
check
commit
continue
cube
cursor
dec
delete
do
else
endif
exec
externlogin
for
from
group
if
inner
inserting
integer
iq
Mot réservé
all
as
between
bottom
capability
char
checkpoint
connect
convert
current
date
decimal
deleting
double
elseif
escape
execute
fetch
force
full
having
in
inout
install
integrated
is
Mot réservé
alter
asc
bigint
break
cascade
char_convert
close
constraint
create
current_timestamp
dbspace
declare
desc
drop
encrypted
except
existing
first
foreign
goto
holdlock
index
insensitive
instead
intersect
isolation
Mot réservé
and
backup
binary
by
case
character
comment
contains
cross
current_user
deallocate
default
distinct
dynamic
end
exception
exists
float
forward
grant
identified
index_lparen
insert
int
into
join
7
key
lock
membership
natural
not
of
option
others
passthrough
print
publication
reference
remove
restore
right
savepoint
session
smallint
start
synchronize
then
to
truncate
unique
updating
values
varying
when
with
within
lateral
login
message
new
notify
off
options
out
precision
privileges
raiserror
references
rename
restrict
rollback
scroll
set
some
stop
syntax_error
time
top
tsequal
unknown
user
varbinary
view
where
with_cube
work
left
long
mode
no
null
on
or
outer
prepare
proc
readtext
release
reorganize
return
rollup
select
setuser
sqlcode
subtrans
table
timestamp
tran
unbounded
unsigned
using
varchar
wait
while
with_lparen
writetext
like
match
modify
noholdlock
numeric
open
order
over
primary
procedure
real
remote
resource
revoke
save
sensitive
share
sqlstate
subtransaction
temporary
tinyint
trigger
union
update
validate
variable
waitfor
window
with_rollup
7.2.2. Tables et colonnes (champs)



On peut utiliser le même nom de colonne dans plusieurs tables;
Les données dans une colonne doivent être toutes du même type;
Nom complet d'une colonne: base_de_données.table.colonne
7.3.
Types de données de col_name
MySQL implémente la plupart des données SQL (lire le manuel)
8
7.3.1. Strings – chaîne de caractères :


délimitateurs: '....' ou " ....."
Il faut quoter les caractères spéciaux avec le \:
\n (newline), \r (CR), \t = (tab), \', \", \\, \%, \_
7.3.2. Attributs à option (dans le tableau suivant)

UNSIGNED (pour les entiers): nombres positives seulement

ZEROFILL (tous les nombres): retourne des 0, par ex. 0004)
7.3.3. Paramètres à option (dans le tableau suivant)


M : taille de display maximal
D (nombres flottants): chiffres après la virgule
7.3.4. La valeur NULL

Une colonne vide contient NULL (qui signifie "vide", et PAS zéro ou "" !!)
7.3.5. Tableau récapitulatif des types
Type
explication
range
exemple
NOMBRES
TinyInt(2)
TinyInt[(M)][UNSIGNED]
entier minuscule
[ZEROFILL]
-128 à 127 (0 à 255)
SmallInT[(M)]...
petit entier
-32768 à 32767 (0 à 64K)
20001
MediumINT[(M)]...
entier moyen
-8388608 to 8388607
-234567
INT[(M)] ...
entier
-2147483648 to 2147483647
BigINT[(M)]...
gros entier
63bits
FLOAT(precision)
nombre flottant
FLOAT[(M,D)]...
nombre flottant
9
-3.402823466E+38
9
to -1.175494351E-38
DOUBLE[(M,D)]...
grand nombre flottant
DATES
DATE
date
DateTime
YYYY-MM-DD
3000-12-31
YYYY-MM-DD HH:MM:SS
TimeStamp[(M)]
TIME
YEAR
Chaînes de caractères (strings)
M = 1 à 225 chars
Char(M) [binary]
String de longeur fixe
case insensible (sauf binary)
VarChar(M)[binary]
String variable
M = 1 à 225 chars
char(4)
'ab '
login(8)[binar
y]
schneiDe
Texte (blobs)
TINYBLOB
petit texts
255 chars
TINYTEXT
BLOB
65535 chars
TEXT
MEDIUMBLOB
16777215 chars
MEDIUMTEXT
LONGBLOB
grand text
4294967295 chars
10
LONGTEXT
Enumération
Enum('val1', 'val2',...)
un string parmi la liste
65535 distinct values
ou NULL
'toto'
Set('val1', 'val2', ...)
zéro ou plusieurs
strings parmi la liste
('toto', 'blurp')
64 members
Voici un exemple simple sans aucune contraintes :
CREATE TABLE SALLE_CINEMA ( nom_salle varchar(20) , adresse varchar(250) ,
visa int(5) ) Myisam;
CREATE TABLE FILM ( visa INT(5) , titre VARCHAR(20) , realisateur VARCHAR(20) ,
année_sortie YEAR ) ;
CREATE TABLE SPECTATEUR ( numero INT(6) , nom VARCHAR(30), prenom
VARCHAR(30), adresse VARCHAR(250) , date_naissance DATE , cat_prof CHAR(5));
Create TABLE APPRECIATION ( visa INT(5), numero INT(6) , impression ENUM('bon',
'moyen', 'mediocre' ) ;
8. CONTRAINTES D'INTEGRITES
8.1.1.1.
les contraintes programment les règles de la gestion des colonnes.
la contrainte est là pour éviter les erreurs par exemple, au moment de la saisie: exemple une note
doit être comprise entre o et 100.
les contraintes peuvent être déclarées en ligne en même temps que la déclaration de la colonne;
ou après la déclaration de la colonne.
8.2.
Syntaxe
A la création d'une table, les contraintes d'intégrité se déclarent de la façon suivante :
CREATE TABLE name_table (
name_col_1 type_1 [CONSTRAINT name_1_1] contrainte_de_colonne_1_1
11
[CONSTRAINT name_1_2] contrainte_de_colonne_1_2
...
...
[CONSTRAINT name_1_m] contrainte_de_colonne_2_m,
name_col_2 type_2 [CONSTRAINT name_2_1] contrainte_de_colonne_2_1
[CONSTRAINT name_2_2] contrainte_de_colonne_2_2
...
...
[CONSTRAINT name_2_m] contrainte_de_colonne_2_m,
...
name_col_n type_n [CONSTRAINT name_n_1] contrainte_de_colonne_n_1
[CONSTRAINT name_n_2] contrainte_de_colonne_n_2
...
...
[CONSTRAINT name_n_m] contrainte_de_colonne_n_m,
[CONSTRAINT name_1] contrainte_de_table_1,
[CONSTRAINT name_2] contrainte_de_table_2,
...
...
[CONSTRAINT name_p] contrainte_de_table_p
)
il faut prendre l'habitude de nommer les contraintes, on prendra les conventions suivantes :
 les clés primaires auront les lettres pk_nomCléPrimaire_nomTable
 les clés secondaires auront les lettres fk_nomCléEtrangère_tableSource_tableCible
 pour une vérification ck_
 pour une unicité un_
On peut aussi ajouter des indexs
 Les indexes améliorent la performance des opérations SELECT
 Chaque table peut avoir 16 indexes (max.)
 On peut indexer toutes les colonnes (SAUF blob et text), mais les colonnes doivent être
déclarées non NULL !!
 On peut limiter l'indexage des CHAR et VARCHAR à qq caractères
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type]
ON tbl_name (col_name [(length)] [ASC | DESC], ...)
Les différentes contraintes de colonne que l'on peut déclarer sont les suivantes :
8.3.
NOT NULL ou NULL :
Interdit (NOT NULL) ou autorise (NULL) l'insertion de valeur NULL pour cet attribut.
8.4.
UNIQUE :
Désigne l'attribut comme clé secondaire de la table. Deux n-uplets ne peuvent recevoir des
valeurs identiques pour cet attribut, mais l'insertion de valeur NULL est toutefois autorisée.
Cette contrainte peut apparaître plusieurs fois dans l'instruction.
8.5.
PRIMARY KEY :
Désigne l'attribut comme clé primaire de la table. La clé primaire étant unique, cette
contrainte ne peut apparaître qu'une seule fois dans l'instruction. La définition d'une clé
12
primaire composée se fait par l'intermédiaire d'une contrainte de table. En fait, la contrainte
PRIMARY KEY est totalement équivalente à la contraite UNIQUE NOT NULL.
8.6. REFERENCES table [(colonne)] [ON
DELETE CASCADE] :
Contrainte d'intégrité référentielle pour l'attribut de la table en cours de définition. Les
valeurs prises par cet attribut doivent exister dans l'attribut colonne qui possède une
contrainte PRIMARY KEY ou UNIQUE dans la table table. En l'absence de précision
d'attribut colonne, l'attribut retenu est celui correspondant à la clé primaire de la table
table spécifiée.
8.7.
CHECK (condition) :
Vérifie lors de l'insertion de n-uplets que l'attribut réalise la condition condition.
8.8.
DEFAULT valeur :
Permet de spécifier la valeur par défaut de l'attribut.
8.9.
Complément sur les contraintes
8.9.1. ON DELETE CASCADE :
Demande la suppression des n-uplets dépendants, dans la table en cours de définition,
quand le n-uplet contenant la clé primaire référencée est supprimé dans la table maître.
8.9.2. ON DELETE SET NULL :
Demande la mise à NULL des attributs constituant la clé étrangère qui font référence au nuplet supprimé dans la table maître.
La suppression d'un n-uplet dans la table maître pourra être impossible s'il existe des n-uplets
dans d'autres tables référençant cette valeur de clé primaire et ne spécifiant pas l'une de ces deux
options.
Voici un exemple simple avec les contraintes d'intégrités :
8.10. EXEMPLE
CREATE TABLE FILM (
visa INT(5) ,
titre VARCHAR(20) ,
realisateur VARCHAR(20) ,
13
année_sortie YEAR
CONSTRAINT pk_FILM PRIMARY KEY (visa)) ENGINE=InnoDB DEFAULT
CHARSET=latin1;
CREATE TABLE SALLE_CINEMA ( nom_salle varchar(20) ,
adresse varchar(250) NOT NULL
visa int(5) ,
CONSTRAINT pk_SALLE_CINEMA PRIMARY KEY (nom_salle),
CONSTRAINT fk_SALLE_CINEMA_FILM_visa FOREIGN KEY (visa)
REFERENCES FILM(visa) )ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE SPECTATEUR ( numero INT(6) ,
nom VARCHAR(30),
prenom VARCHAR(30),
adresse VARCHAR(250) ,
date_naissance DATE ,
cat_prof ENUM ('1', '2', '3', '4', '5'),
CONSTRAINT pk_FILM PRIMARY KEY (numero)) ENGINE=InnoDB DEFAULT
CHARSET=latin1;
CREATE TABLE APPRECIATION ( visa INT(5),
numero INT(6) ,
impression ENUM('bon', 'moyen', 'mediocre' ),
CONSTRAINT pk_APPRECIATION PRIMARY KEY (visa, numero),
INDEX (visa),
CONSTRAINT fk_APPRECIATION_SPECTATEUR_numero FOREIGN KEY (numero),
CONSTRAINT fk_APPRECIATION_FILM_visa FOREIGN KEY (visa)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
9. DESCRIBE
14
9.1.
Syntaxe de DESCRIBE
DESCRIBE fournit des informations à propos des colonnes de la table. DESCRIBE est un
raccourci de SHOW COLUMNS FROM.
{DESCRIBE | DESC} nom_de_table [nom_de_colonne | wild
nom_de_colonne peut être le nom d'une colonne ou une chaîne contenant les caractères
spéciaux SQL ‘%’ et ‘_’. Il n'est pas nécessaire de placer la chaîne entre guillemets, hormis s'il y
a des espaces ou d'autres caractères spéciaux.
9.2.
Exemple de describe
mysql> DESCRIBE city;
+------------+----------+------+-----+---------+----------------+
| Field
| Type
| Null | Key | Default | Extra
|
+------------+----------+------+-----+---------+----------------+
| Id
| int(11) |
| PRI | NULL
| auto_increment |
| Name
| char(35) |
|
|
|
|
| Country
| char(3) |
| UNI |
|
|
| District
| char(20) | YES | MUL |
|
|
| Population | int(11) |
|
| 0
|
|
+------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
Null indique si la valeur NULL peut être stockée dans la colonne. YES indique que c'est le cas.
Key indique si un champ est indexé. La valeur PRI indique que le champ fait partie de la clé
primaire de la table.
UNI indique que le champ fait partie d'un index UNIQUE.
La valeur MUL indique que plusieurs occurences d'une valeur sont autorisées dans le champ.
Un champ peut être désigné comme MUL même si l'index UNIQUE est utilisé, si les valeurs NULL
sont autorisées, car une colonne UNIQUE peut contenir plusieurs valeurs NULL si la colonne est
déclarée comme NOT NULL. Une autre cause pour MUL sur une colonne UNIQUE est lorsque
deux colonnes forment un couple UNIQUE : même si la combinaison des deux colonnes est
toujours unique, chaque colonne peut contenir des valeurs multiples. Notez que dans un index
composé, seul le champ de gauche aura une entrée dans la colonne Key.
Default indique la valeur par défaut assignée à ce champ.
Extra indique des informations supplémentaires, disponibles sur le champ. Dans notre exemple,
la colonne Extra indique que la colonne Id porte l'attribut AUTO_INCREMENT.
Cette instruction est fournie pour une meilleure compatibilité avec Oracle.
L'instruction SHOW renvoie les mêmes informations.
15
10.
DETRUIRE UNE TABLE (DROP
TABLE)
10.1. Syntaxe de DROP TABLE
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
DROP TABLE supprime une ou plusieurs tables. Toutes les données et la structure de la tables
sont perdues, alors soyez prudents avec cette commande !
RESTRICT et CASCADE sont autorisés pour faciliter le port. Pour le moment, elles ne font rien.
Note : DROP TABLE va automatiquement valider les transactions actives (hormis si vous utilisez
la version 4.1 et le mot clé TEMPORARY).
L'option TEMPORARY est ignorée en 4.0. En 4.1, cette option fonctionne comme suit :

Détruit uniquement les tables temporaires.

Ne termine pas les transactions en cours.

Aucun droits d'accès n'est vérifié.
TEMPORARY est pour le moment ignoré; Dans un futur proche, il servira à s'assurer qu'on efface
vraiment une table temporaire.
10.2. Exemple de DROP
DROP table nom_table ;
11. RENOMMER UNE TABLE (RENAME
TABLE)
11.1. Syntaxe de RENAME TABLE
RENAME TABLE nom_de_table TO nouveau_nom_de_table[, nom_de_table2 TO
nouveau_nom_de_table2,...]
Le changement de nom se fait automtiquement ce qui signifie qu'aucun autre processus ne peut
16
accéder la table tant que l'opération est en cours. Cela rend possible de remplacer une vielle table
avec une table vide :
CREATE TABLE nouvelle_table (...);
RENAME TABLE ancienne_table TO backup_table, nouvelle_table TO ancienne_table;
L'opération s'effectue de gauche à droite ce qui signifie que si vous voulez échanger deux noms
de tables, vous devez :
RENAME TABLE ancienne_table
TO backup_table,
nouvelle_table
TO ancienne_table,
backup_table TO nouvelle_table;
Si les deux bases de données sont sur le même disque, vous pouvez renommer à travers les
bases :
RENAME TABLE bdd_courante.nom_de_table TO autre_bdd.nom_de_table;
Quand vous exécutez RENAME, vous ne pouvez avoir aucune transaction active ou une table
protégée en mode écriture. Vous devez avoir les privilèges ALTER et DROP sur l'ancienne table,
et les privilèges CREATE et INSERT sur la nouvelle.
Si MySQL rencontre des erreurs dans un renommage multiple, il remettra les noms changés à
leurs valeurs d'origine pour revenir à l'état d'origine.
RENAME TABLE a été ajouté à la version 3.23.23 de MySQL.
11.2. Exemple de rename
RENAME table toto LOLO ;
Désormais La table toto sera la table LOLO
à partir de maintenant.
12. MODIFIER UNE TABLE ALTER TABLE
ALTER TABLE vous permet de changer la structure d'une table existante. Par exemple, vous
pouvez ajouter ou supprimer des colonnes, des index, changer le type des colonnes existantes,
renommer ces colonnes, ou la table elle-même. Vous pouvez de même changer le commentaire
sur la table, ou le type de celle-ci
12.1. Syntaxe de ALTER TABLE
ALTER [IGNORE] TABLE tbl_name
alter_specification [, alter_specification] ...
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD INDEX [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
17
| ADD [CONSTRAINT [symbol]]
UNIQUE [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_options
.

Pour utiliser ALTER TABLE, vous devez avoir les droits ALTER, INSERT, et CREATE
sur la table.

IGNORE est une extension MySQL pour ANSI SQL92. Cette option contrôle la façon
dont ALTER TABLE fonctionne s'il y a des duplications sur une clef unique de la
nouvelle table. Si IGNORE n'est pas spécifiée, la copie est annulée et la table originale est
restaurée. Si IGNORE est spécifiée, les lignes contenant les éléments doublons de la table
seront effacées, hormis la première, qui sera conservée.

Vous pouvez effectuer plusieurs opérations de ADD, ALTER, DROP, et CHANGE dans une
même commande ALTER TABLE.

MODIFY est une extension Oracle à ALTER TABLE.

Le mot optionnel COLUMN peut être ignoré.

Si vous utilisez ALTER TABLE nom_de_table RENAME TO nouveau_nom sans
autre option, MySQL va simplement renommer les fichiers qui correspondent à la table
nom_de_table. Il n'y a pas de création de fichier temporaire.
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Si vous ne voulez changer que le type de la colonne, avec la clause CHANGE vous devrez
redonner le nom de la colonne. Par exemple :
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
18
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

Si vous utilisez les clauses CHANGE ou MODIFY pour réduire la taille d'une colonne qui
comportait un index sur une partie de la colonne (par exemple, si vous aviez un index sur
10 caractères d'une colonne de type VARCHAR), vous ne pouvez pas rendre la colonne
plus petite que le nombre de caractères indexés.

Si des colonnes sont effacées d'une table, ces colonnes sont aussi supprimés des index
dont elles font partie. Si toutes les colonnes qui forment un index sont effacées, l'index lui
même est supprimé.

Si une table ne comporte qu'une seule colonne, La colonne ne peut être supprimée. Si
vous voulez effacer la table, utilisez la commande DROP TABLE.

DROP PRIMARY KEY supprime la clef primaire. Si cette clef n'existe pas, cette
commande effacera le premier index UNIQUE de la table. (MySQL marque la première
clef UNIQUE en tant que PRIMARY KEY si aucune PRIMARY KEY n'a été spécifiée
explicitement.)
Si vous ajoutez un UNIQUE INDEX ou PRIMARY KEY à une table, c'est enregistré
avant les index non-UNIQUE pour que MySQL puisse détecter les valeurs dupliquées
aussi vite que possible.

ORDER BY vous permet de créer une nouvelle table tout en ordonnant les lignes par
défaut. Notez que cet ordre ne sera pas conservé après les prochaines insertions et
modifications. Dans certains cas, cela aide MySQL si les colonnes sont dans l'ordre dans
lequel vous allez trier les valeurs. Cette option n'est vraiment utile que si vous savez à
l'avance dans quel ordre vous effectuerez les tris : vous y gagnerez alors en performances.

Si vous utilisez ALTER TABLE sur une table MyISAM, tous les index non-uniques sont
créés par des opérations séparées. (comme dans REPAIR). Cela devrait rendre ALTER
TABLE plus rapide quand vous avez beaucoup d'index.
Depuis la version 4.0, la fonctionnalité ci-dessus peut être activée explicitement. ALTER
TABLE ... DISABLE KEYS force MySQL à ne plus mettre à jour les index nonuniques pour les tables au format MyISAM. ALTER TABLE ... ENABLE KEYS doit
alors être utilisé pour recréer les index manquants. Comme MySQL le fait avec un
algorithme spécial qui est plus rapide que le fait d'insérer les clefs une par une, désactiver
les clefs peut vous faire gagner en performances.

Les clauses FOREIGN KEY et REFERENCES sont supportées par le moteur de tables
InnoDB, qui implémente les clauses ADD [CONSTRAINT [symbol]] FOREIGN
KEY (...) REFERENCES ... (...).

Pour les autres moteurs de stockages, ces clauses sont lues mais ignorées. La clause
CHECK est analysée mais ignorée par tous les moteurs de stockage. La raison pour
accepter mais ignorer ces clauses est que cela renforce la compatibilité avec le code des
autres serveurs SQL, et qu'il est possible de créer des tables avec des références.

Depuis MySQL 4.0.13, InnoDB supporte l'utilisation de ALTER TABLE pour effacer
19
des clés étrangères :
ALTER TABLE yourtablename
DROP FOREIGN KEY fk_symbol

Depuis MySQL 4.1.2, si vous voulez changer dans toutes les colonnes de texte (CHAR,
VARCHAR, TEXT) le jeu de caractères, vous pouvez utiliser la commande suivante :
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
12.2. Exemple de alter table
Voilà un exemple qui montre quelques utilisations de ALTER TABLE. On commence par une
table t1 créée comme suit :
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Pour renommer la table de t1 à t2 :
mysql> ALTER TABLE t1 RENAME t2;
Pour changer une colonne a de INTEGER en TINYINT NOT NULL (en laissant le même nom),
et pour changer une colonne b de CHAR(10) à CHAR(20) et la renommant de b en c :
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Pour ajouter une nouvelle colonne TIMESTAMP nommée d :
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Pour ajouter un index sur une colonne d, et rendre la colonne a la clef primaire :
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Pour effacer la colonne c :
mysql> ALTER TABLE t2 DROP COLUMN c;
Pour ajouter une nouvelle colonne AUTO_INCREMENT nommée c :
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
Notez que nous avons indexé c, car les colonnes AUTO_INCREMENT doivent être indexées, et
que nous définissons aussi c en tant que NOT NULL, car les colonnes indexées ne peuvent être
NULL.
Quand vous ajoutez une colonne AUTO_INCREMENT, les valeurs de la colonne sont remplies
automatiquement pour vous. Vous pouvez choisir la valeur de départ pour l'indexation en
utilisant SET INSERT_ID=# avant ALTER TABLE ou en utilisant l'option
AUTO_INCREMENT = # de la table.
20
Avec les tables de type MyISAM, si vous ne changez pas la colonne AUTO_INCREMENT, l'indice
d'auto-incrémentation ne sera pas affecté. Si vous effacez une colonne AUTO_INCREMENT puis
en ajoutez une autre, l'indexation recommencera à partir de 1.
13.
ANALYZE TABLE
13.1.
Syntaxe de ANALYZE TABLE
ANALYZE TABLE nom_de_table[,nom_de_table...]
Cette commande analyse et stocke la clé de distribution de la table. Durant l'analyse, la table est
verrouillée en lecture. Cette commande fonctionne avec les tables MyISAM et BDB.
C'est l'équivalent de la commande en ligne myisamchk -a.
MySQL utilise les clés de distribution pour décider dans quel ordre les tables doivent être
rassemblées lors des jointures qui ne s'effectuent pas sur une constante.
La commande retourne une table avec les colonnes suivantes :
Colonne
Table
Op
Msg_type
Msg_text
Valeur
Nom de la table
``analyze'' (toujours)
Un des status, error, info ou warning.
Le message.
Si la table n'a pas changé depuis la dernière commande ANALYZE TABLE, elle ne sera pas
analysée à nouveau.
13.2. Exemple de ANALYZE
Analyse BENARIB.toto ;
Analyse la table toto de la base BENARIB.
14.
TRUNCATE
14.1.
Description
Supprimer toutes les lignes d'une table, sans supprimer la définition de la table.
21
14.2. Syntaxe
TRUNCATE TABLE [ propriétaire.]nom_table
14.3. Utilisation
L'instruction TRUNCATE TABLE permet de supprimer toutes les lignes d'une table. C'est
l'équivalent d'une instruction DELETE sans clause WHERE, si ce n'est qu'aucun trigger n'est
déclenché et que les suppressions de lignes individuelles ne sont pas enregistrées dans le journal
de transactions.
Après une instruction TRUNCATE TABLE, la structure de la table et tous ses index continuent
d'exister et ce, jusqu'à l'exécution d'une instruction DROP TABLE. Les définitions et les
contraintes de colonne restent intactes, et les triggers et les autorisations restent en vigueur.
L'instruction TRUNCATE TABLE est enregistrée dans le journal de transactions en tant
qu'instruction unique, au même titre qu'une instruction de définition de données. Les suppressions
de lignes individuelles ne sont pas consignées dans le journal.
Si l'option TRUNCATE_WITH_AUTO_COMMIT est activée (ON, valeur par défaut) et que
tous les critères suivants sont satisfaits, une troncature rapide de la table est exécutée :

Il n'existe pas de clés étrangères dirigées vers la table ou en provenant.

L'instruction TRUNCATE TABLE n'est pas exécutée à l'intérieur d'un trigger.

L'instruction TRUNCATE TABLE n'est pas exécutée à l'intérieur d'une instruction
atomique.
En cas de troncature rapide, un COMMIT est exécuté avant et après l'opération.
14.4. Autorisations
Vous devez être le propriétaire de la table, ou posséder les droits , ou détenir les autorisations
ALTER sur la table.
Pour les tables de la base, l'instruction TRUNCATE TABLE exige un accès exclusif sur la table
car l'opération est atomique (soit toutes les lignes sont supprimées, soit aucune ne l'est). Cela
signifie que les curseurs précédemment ouverts et référençant la table tronquée doivent être
fermés et qu'un COMMIT ou un ROLLBACK doit être exécuté pour libérer la référence à la
table.
Pour les tables temporaires, chaque utilisateur possède sa propre copie de données et l'accès
exclusif n'est donc pas requis.
22
Téléchargement