| 1 |
<!-- $Header: /var/lib/cvs/pgsql-fr/sgml/dml.sgml,v 1.6.2.1 2005/03/20 22:34:39 guillaume Exp $ --> |
|---|
| 2 |
|
|---|
| 3 |
<chapter id="dml"> |
|---|
| 4 |
<title>Manipulation de données</title> |
|---|
| 5 |
|
|---|
| 6 |
<comment> |
|---|
| 7 |
Ce chapitre est toujours assez incomplet. |
|---|
| 8 |
</comment> |
|---|
| 9 |
|
|---|
| 10 |
<para> |
|---|
| 11 |
Le chapitre précédent expliquait comment créer des tables et |
|---|
| 12 |
d'autres structures pour stocker vos données. Nous allons maintenant remplir |
|---|
| 13 |
ces tables avec des données. Ce chapitre montre comment insérer, |
|---|
| 14 |
mettre à jour et supprimer des données des tables. |
|---|
| 15 |
Nous allons aussi montrer des méthodes pour effectuer des changements |
|---|
| 16 |
automatiquement dans les données quand certains événements ont lieu : |
|---|
| 17 |
les déclencheurs et les règles de réécriture. Le chapitre suivant expliquera |
|---|
| 18 |
enfin comment extraire des données perdues depuis longtemps dans la base de |
|---|
| 19 |
données. |
|---|
| 20 |
</para> |
|---|
| 21 |
|
|---|
| 22 |
<sect1 id="dml-insert"> |
|---|
| 23 |
<title>Insérer des données</title> |
|---|
| 24 |
|
|---|
| 25 |
<indexterm zone="dml-insert"> |
|---|
| 26 |
<primary>insertion</primary> |
|---|
| 27 |
</indexterm> |
|---|
| 28 |
|
|---|
| 29 |
<indexterm zone="dml-insert"> |
|---|
| 30 |
<primary>INSERT</primary> |
|---|
| 31 |
</indexterm> |
|---|
| 32 |
|
|---|
| 33 |
<para> |
|---|
| 34 |
Quand une table est créée, elle ne contient aucune donnée. |
|---|
| 35 |
La première chose à faire, c'est d'y insérer des données. Sinon, |
|---|
| 36 |
la base de données n'est pas d'une grande utilité. |
|---|
| 37 |
Les données sont insérées ligne par ligne. Bien sûr, il est possible |
|---|
| 38 |
d'insérer plus d'une ligne mais il n'est pas possible d'entrer moins |
|---|
| 39 |
qu'une ligne à la fois. Même si vous ne connaissez les valeurs que |
|---|
| 40 |
pour quelques colonnes, une ligne complète doit être créée. |
|---|
| 41 |
</para> |
|---|
| 42 |
|
|---|
| 43 |
<para> |
|---|
| 44 |
Pour créer une nouvelle ligne, utilisez la commande |
|---|
| 45 |
<literal>INSERT</literal>. |
|---|
| 46 |
La commande a besoin du nom de la table et d'une valeur pour |
|---|
| 47 |
chaque colonne de cette table. |
|---|
| 48 |
Par exemple, utilisons produits, la table des produits |
|---|
| 49 |
de <xref linkend="ddl"> : |
|---|
| 50 |
<programlisting> |
|---|
| 51 |
CREATE TABLE produits ( |
|---|
| 52 |
no_produit integer, |
|---|
| 53 |
nom text, |
|---|
| 54 |
prix numeric |
|---|
| 55 |
); |
|---|
| 56 |
</programlisting> |
|---|
| 57 |
Un exemple de commande pour insérer une ligne serait : |
|---|
| 58 |
<programlisting> |
|---|
| 59 |
INSERT INTO produits VALUES (1, 'Fromage', 9.99); |
|---|
| 60 |
</programlisting> |
|---|
| 61 |
Les données sont listées dans l'ordre dans lequel les colonnes |
|---|
| 62 |
apparaissent dans la table, séparées par des virgules. Souvent, les |
|---|
| 63 |
données sont des littéraux (constantes) mais les expressions |
|---|
| 64 |
scalaires sont aussi acceptées. |
|---|
| 65 |
</para> |
|---|
| 66 |
|
|---|
| 67 |
<para> |
|---|
| 68 |
La syntaxe précédente a le défaut qu'il faut connaître l'ordre des colonnes. |
|---|
| 69 |
Pour éviter ce problème, vous pouvez aussi lister les colonnes explicitement. |
|---|
| 70 |
Par exemple, les deux commandes suivantes ont le même effet que la |
|---|
| 71 |
précédente : |
|---|
| 72 |
<programlisting> |
|---|
| 73 |
INSERT INTO produits (no_produit, nom, prix) VALUES (1, 'Fromage', 9.99); |
|---|
| 74 |
INSERT INTO produits (nom, prix, no_produit) VALUES ('Fromage', 9.99, 1); |
|---|
| 75 |
</programlisting> |
|---|
| 76 |
Beaucoup d'utilisateurs recommandent de toujours lister les noms de colonnes. |
|---|
| 77 |
</para> |
|---|
| 78 |
|
|---|
| 79 |
<para> |
|---|
| 80 |
Si vous ne connaissez pas les valeurs de certaines colonnes, |
|---|
| 81 |
vous pouvez les omettre. Dans ce cas, elles seront remplies avec leur |
|---|
| 82 |
valeur par défaut. Par exemple, |
|---|
| 83 |
<programlisting> |
|---|
| 84 |
INSERT INTO produits (no_produit, nom) VALUES (1, 'Fromage'); |
|---|
| 85 |
INSERT INTO produits VALUES (1, 'Fromage'); |
|---|
| 86 |
</programlisting> |
|---|
| 87 |
La seconde instruction est une extension de |
|---|
| 88 |
<productname>PostgreSQL</productname>. Elle remplit les colonnes de |
|---|
| 89 |
gauche à droite avec toutes les valeurs données, et les autres prennent |
|---|
| 90 |
leur valeur par défaut. |
|---|
| 91 |
</para> |
|---|
| 92 |
|
|---|
| 93 |
<para> |
|---|
| 94 |
Pour plus de clarté, vous pouvez aussi explicitement demander les valeurs |
|---|
| 95 |
par défaut pour des colonnes spécifiques ou pour la ligne complète. |
|---|
| 96 |
<programlisting> |
|---|
| 97 |
INSERT INTO produits (no_produit, nom, prix) VALUES (1, 'Fromage', DEFAULT); |
|---|
| 98 |
INSERT INTO produits DEFAULT VALUES; |
|---|
| 99 |
</programlisting> |
|---|
| 100 |
</para> |
|---|
| 101 |
|
|---|
| 102 |
<tip> |
|---|
| 103 |
<para> |
|---|
| 104 |
Pour faire des chargements en masse (insertion de grandes quantités |
|---|
| 105 |
de données), jetez un œil à la commande <xref linkend="sql-copy" |
|---|
| 106 |
endterm="sql-copy-title">. Elle n'est pas aussi souple que la |
|---|
| 107 |
commande <command>INSERT</command> mais elle est plus efficace. |
|---|
| 108 |
</para> |
|---|
| 109 |
</tip> |
|---|
| 110 |
</sect1> |
|---|
| 111 |
|
|---|
| 112 |
<sect1 id="dml-update"> |
|---|
| 113 |
<title>Modifier des données</title> |
|---|
| 114 |
|
|---|
| 115 |
<indexterm zone="dml-update"> |
|---|
| 116 |
<primary>modification</primary> |
|---|
| 117 |
</indexterm> |
|---|
| 118 |
|
|---|
| 119 |
<indexterm zone="dml-update"> |
|---|
| 120 |
<primary>UPDATE</primary> |
|---|
| 121 |
</indexterm> |
|---|
| 122 |
|
|---|
| 123 |
<para> |
|---|
| 124 |
La modification de données déjà présentes dans la base est |
|---|
| 125 |
appelée mise à jour (update en anglais). |
|---|
| 126 |
Vous pouvez mettre à jour une ligne spécifique, toutes |
|---|
| 127 |
les lignes d'une table ou un sous-ensemble des lignes |
|---|
| 128 |
de la table. Chaque colonne peut être mise à jour séparément ; |
|---|
| 129 |
les autres colonnes ne sont pas modifiées. |
|---|
| 130 |
</para> |
|---|
| 131 |
|
|---|
| 132 |
<para> |
|---|
| 133 |
Pour faire une mise à jour, il faut trois informations : |
|---|
| 134 |
<orderedlist spacing=compact> |
|---|
| 135 |
<listitem> |
|---|
| 136 |
<para>le nom de la table et de la colonne à mettre à jour ;</para> |
|---|
| 137 |
</listitem> |
|---|
| 138 |
|
|---|
| 139 |
<listitem> |
|---|
| 140 |
<para>la nouvelle valeur de la colonne ;</para> |
|---|
| 141 |
</listitem> |
|---|
| 142 |
|
|---|
| 143 |
<listitem> |
|---|
| 144 |
<para>les lignes à mettre à jour.</para> |
|---|
| 145 |
</listitem> |
|---|
| 146 |
</orderedlist> |
|---|
| 147 |
</para> |
|---|
| 148 |
|
|---|
| 149 |
<para> |
|---|
| 150 |
Nous avons vu dans le <xref linkend="ddl"> que le SQL ne donne pas |
|---|
| 151 |
par défaut d'identifiant unique pour les lignes. Du coup, |
|---|
| 152 |
il n'est pas nécessairement possible d'indiquer directement quelle |
|---|
| 153 |
ligne il faut mettre à jour. À la place, nous indiquons quelles conditions |
|---|
| 154 |
une ligne doit remplir pour être mise à jour. Si la table a une clé primaire |
|---|
| 155 |
(qu'elle soit déclarée ou non), nous pouvons indiquer une ligne unique en |
|---|
| 156 |
donnant une condition qui porte sur la clé primaire. Les outils graphiques |
|---|
| 157 |
d'accès aux bases de données utilisent ce principe pour vous permettre de |
|---|
| 158 |
modifier les lignes individuellement. |
|---|
| 159 |
</para> |
|---|
| 160 |
|
|---|
| 161 |
<para> |
|---|
| 162 |
Par exemple, cette commande modifie tous les produits qui ont un prix de |
|---|
| 163 |
5 et met leur prix à 10. |
|---|
| 164 |
<programlisting> |
|---|
| 165 |
UPDATE produits SET prix = 10 WHERE prix = 5; |
|---|
| 166 |
</programlisting> |
|---|
| 167 |
Ceci peut mettre à jour zéro, une ou plusieurs lignes. |
|---|
| 168 |
Ce n'est pas une erreur d'exécuter une commande |
|---|
| 169 |
<literal>UPDATE</literal> qui ne met à jour aucune ligne. |
|---|
| 170 |
</para> |
|---|
| 171 |
|
|---|
| 172 |
<para> |
|---|
| 173 |
Voyons la commande en détail : d'abord, il y a le mot clé |
|---|
| 174 |
<literal>UPDATE</literal> suivi par le nom de la table. |
|---|
| 175 |
Comme d'habitude, le nom de la table peut être précisé par un nom de |
|---|
| 176 |
schéma, sans quoi le schéma est recherché dans le chemin. |
|---|
| 177 |
Ensuite, il y a le mot clé <literal>SET</literal> suivi par |
|---|
| 178 |
le nom de la colonne, un signe égal et la nouvelle valeur de la colonne. |
|---|
| 179 |
La nouvelle valeur de la colonne peut être une constante ou une |
|---|
| 180 |
expression scalaire. Par exemple, pour augmenter de 10% le prix de tous les |
|---|
| 181 |
produits, on peut exécuter : |
|---|
| 182 |
<programlisting> |
|---|
| 183 |
UPDATE produits SET prix = prix * 1.10; |
|---|
| 184 |
</programlisting> |
|---|
| 185 |
Comme vous le voyez, l'expression donnant la nouvelle valeur peut |
|---|
| 186 |
faire référence à l'ancienne valeur. |
|---|
| 187 |
Nous n'avons pas encore parlé de la clause <literal>WHERE</literal>. |
|---|
| 188 |
Si elle est omise, cela veut dire que toutes les lignes de la table sont |
|---|
| 189 |
modifiées. Si elle est présente, seules les lignes qui remplissent la |
|---|
| 190 |
condition après le <literal>WHERE</literal> sont mises à jour. |
|---|
| 191 |
Remarquez que le signe égal dans la clause <literal>SET</literal> |
|---|
| 192 |
est une affectation, alors que celui de la clause |
|---|
| 193 |
<literal>WHERE</literal> est une comparaison, mais cela ne crée pas |
|---|
| 194 |
d'ambiguïté. Bien sûr, les conditions ne sont pas nécessairement des tests |
|---|
| 195 |
d'égalité. De nombreux autres opérateurs existent (voir le <xref |
|---|
| 196 |
linkend="functions">). Mais l'expression doit s'évaluer en une expression |
|---|
| 197 |
booléenne. |
|---|
| 198 |
</para> |
|---|
| 199 |
|
|---|
| 200 |
<para> |
|---|
| 201 |
Il est aussi possible de mettre plus d'une colonne à jour dans |
|---|
| 202 |
une commande <literal>UPDATE</literal> en indiquant plusieurs |
|---|
| 203 |
colonnes dans la clause <literal>SET</literal>. Par exemple : |
|---|
| 204 |
<programlisting> |
|---|
| 205 |
UPDATE matable SET a = 5, b = 3, c = 1 WHERE a > 0; |
|---|
| 206 |
</programlisting> |
|---|
| 207 |
</para> |
|---|
| 208 |
</sect1> |
|---|
| 209 |
|
|---|
| 210 |
<sect1 id="dml-delete"> |
|---|
| 211 |
<title>Supprimer des données</title> |
|---|
| 212 |
|
|---|
| 213 |
<indexterm zone="dml-delete"> |
|---|
| 214 |
<primary>suppression</primary> |
|---|
| 215 |
</indexterm> |
|---|
| 216 |
|
|---|
| 217 |
<indexterm zone="dml-delete"> |
|---|
| 218 |
<primary>DELETE</primary> |
|---|
| 219 |
</indexterm> |
|---|
| 220 |
|
|---|
| 221 |
<para> |
|---|
| 222 |
Jusqu'ici, nous avons expliqué comment ajouter des données à une table |
|---|
| 223 |
et comment les modifier. Il nous reste à voir comment les enlever quand |
|---|
| 224 |
elles ne sont plus nécessaires. De la même façon que pour l'insertion, la |
|---|
| 225 |
suppression ne peut se faire que par ligne entière. Dans la section |
|---|
| 226 |
précédente, nous avons expliqué que le SQL ne propose pas de moyen |
|---|
| 227 |
d'accéder à une ligne particulière. C'est pourquoi la suppression de |
|---|
| 228 |
lignes se fait en indiquant les conditions à remplir par les lignes à |
|---|
| 229 |
supprimer. S'il y a une clé primaire dans la table, alors il est |
|---|
| 230 |
possible d'indiquer exactement la ligne à supprimer. |
|---|
| 231 |
Mais on peut aussi supprimer un groupe de lignes qui remplissent une |
|---|
| 232 |
condition, ou même toutes les lignes d'une table d'un coup. |
|---|
| 233 |
</para> |
|---|
| 234 |
|
|---|
| 235 |
<para> |
|---|
| 236 |
On utilise la commande <literal>DELETE</literal> pour supprimer des |
|---|
| 237 |
lignes ; la syntaxe est très similaire à la commande |
|---|
| 238 |
<literal>UPDATE</literal>. Par exemple, pour supprimer toutes les lignes de |
|---|
| 239 |
la table produits qui ont un prix de 10, on exécute : |
|---|
| 240 |
<programlisting> |
|---|
| 241 |
DELETE FROM produits WHERE prix = 10; |
|---|
| 242 |
</programlisting> |
|---|
| 243 |
</para> |
|---|
| 244 |
|
|---|
| 245 |
<para> |
|---|
| 246 |
En indiquant simplement |
|---|
| 247 |
<programlisting> |
|---|
| 248 |
DELETE FROM produits; |
|---|
| 249 |
</programlisting> |
|---|
| 250 |
on supprime toutes les lignes de la table. Attention aux mauvaises |
|---|
| 251 |
manipulations ! |
|---|
| 252 |
</para> |
|---|
| 253 |
</sect1> |
|---|
| 254 |
</chapter> |
|---|
| 255 |
|
|---|