| 1 |
<!-- $Header: /var/lib/cvs/pgsql-fr/sgml/ddl.sgml,v 1.11 2005/07/15 06:14:21 guillaume Exp $ --> |
|---|
| 2 |
|
|---|
| 3 |
<chapter id="ddl"> |
|---|
| 4 |
<title>Définition des données</title> |
|---|
| 5 |
|
|---|
| 6 |
<para> |
|---|
| 7 |
Ce chapitre couvre la création de structures de données qui contiendront |
|---|
| 8 |
les données de quelqu'un. Dans une base relationnelle, les données brutes |
|---|
| 9 |
sont stockées dans des tables. Du coup, la plus grande partie de ce chapitre |
|---|
| 10 |
sera consacrée à l'explication de la création et de la modification des tables |
|---|
| 11 |
et des fonctions disponibles pour contrôler les données stockées dans les tables. |
|---|
| 12 |
Ensuite, nous discuterons de l'organisation de tables en schémas, et comment |
|---|
| 13 |
des droits peuvent être attribués aux tables. Enfin, |
|---|
| 14 |
nous verrons brièvement d'autres fonctionnalités, tel que les vues, les fonctions |
|---|
| 15 |
et les déclencheurs. |
|---|
| 16 |
</para> |
|---|
| 17 |
|
|---|
| 18 |
<sect1 id="ddl-basics"> |
|---|
| 19 |
<title>Bases sur les tables</title> |
|---|
| 20 |
|
|---|
| 21 |
<indexterm zone="ddl-basics"> |
|---|
| 22 |
<primary>table</primary> |
|---|
| 23 |
</indexterm> |
|---|
| 24 |
|
|---|
| 25 |
<indexterm> |
|---|
| 26 |
<primary>rangée</primary> |
|---|
| 27 |
</indexterm> |
|---|
| 28 |
|
|---|
| 29 |
<indexterm> |
|---|
| 30 |
<primary>colonne</primary> |
|---|
| 31 |
</indexterm> |
|---|
| 32 |
|
|---|
| 33 |
<para> |
|---|
| 34 |
Une table dans une base relationnelle ressemble beaucoup à un tableau |
|---|
| 35 |
sur papier : elle est constituée de rangées et de colonnes. Le nombre |
|---|
| 36 |
et l'ordre des colonnes sont fixés et chaque colonne a un nom. Le |
|---|
| 37 |
nombre de rangées est variable -- il représente la quantité de données |
|---|
| 38 |
stockées à un moment donné. SQL n'apporte aucune garantie sur l'ordre des |
|---|
| 39 |
rangées dans une table. Quand une table est lue, les rangées |
|---|
| 40 |
apparaîtront dans un ordre aléatoire sauf si un tri est demandé |
|---|
| 41 |
explicitement. Ceci est couvert dans <xref linkend="queries">. De plus, |
|---|
| 42 |
SQL n'attribue pas d'identifiant unique aux rangées. Du coup, il est possible |
|---|
| 43 |
d'avoir plusieurs rangées complètement identiques dans une table. Ceci |
|---|
| 44 |
est une conséquence du modèle mathématique sur lequel repose SQL mais |
|---|
| 45 |
n'est habituellement pas désiré. |
|---|
| 46 |
Plus tard dans ce chapitre, nous verrons comment traiter ce problème. |
|---|
| 47 |
</para> |
|---|
| 48 |
|
|---|
| 49 |
<para> |
|---|
| 50 |
Chaque colonne a un type de donnée. Ce type de donnée restreint la série |
|---|
| 51 |
de valeurs possibles qui peuvent être attribuées à une colonne et attribue |
|---|
| 52 |
des sémantiques à la donnée stockée dans la colonne pour qu'elles puissent |
|---|
| 53 |
être utilisées pour des calculs. Par exemple, une colonne déclarée comme |
|---|
| 54 |
étant d'un type numérique n'acceptera pas une chaîne arbitraire de texte, |
|---|
| 55 |
et les données stockées dans une telle table peuvent être utilisées dans |
|---|
| 56 |
des calculs mathématiques. |
|---|
| 57 |
Par opposition, une colonne déclarée comme étant de type chaîne de |
|---|
| 58 |
caractères acceptera pratiquement n'importe quel type de donnée mais ne |
|---|
| 59 |
se prêtera pas à des calculs mathématiques bien que d'autres opérations |
|---|
| 60 |
tel que la concaténation des chaînes sont disponibles. |
|---|
| 61 |
</para> |
|---|
| 62 |
|
|---|
| 63 |
<para> |
|---|
| 64 |
<productname>PostgreSQL</productname> inclut une série conséquente de types |
|---|
| 65 |
de données intégrés qui correspondent à plusieurs applications. Les |
|---|
| 66 |
utilisateurs peuvent aussi définir leurs propres types de données. La |
|---|
| 67 |
plupart des types de données intégrés ont des noms et des sémantiques |
|---|
| 68 |
évidents alors nous reportons une explication détaillée à <xref |
|---|
| 69 |
linkend="datatype">. Quelques-uns des types les plus utilisés sont |
|---|
| 70 |
<type>integer</type> pour les entiers, <type>numeric</type> pour |
|---|
| 71 |
les nombres pouvant être fractionnels, <type>text</type> pour les chaînes de |
|---|
| 72 |
caractères, <type>date</type> pour les dates, <type>time</type> pour |
|---|
| 73 |
les valeurs de type heure et <type>timestamp</type> pour les valeurs |
|---|
| 74 |
contenant et une date et une heure. |
|---|
| 75 |
</para> |
|---|
| 76 |
|
|---|
| 77 |
<indexterm> |
|---|
| 78 |
<primary>table</primary> |
|---|
| 79 |
<secondary>création</secondary> |
|---|
| 80 |
</indexterm> |
|---|
| 81 |
|
|---|
| 82 |
<para> |
|---|
| 83 |
Pour créer une table, il faut utiliser la commande bien nommée <command>CREATE |
|---|
| 84 |
TABLE</command>. Dans cette commande, vous devez spécifier au moins le nom de la |
|---|
| 85 |
nouvelle table, les noms des colonnes et le type de données pour chacune des |
|---|
| 86 |
colonnes. Par exemple : |
|---|
| 87 |
<programlisting> |
|---|
| 88 |
CREATE TABLE ma_premiere_table ( |
|---|
| 89 |
premiere_colonne text, |
|---|
| 90 |
deuxieme_colonne integer |
|---|
| 91 |
); |
|---|
| 92 |
</programlisting> |
|---|
| 93 |
Ceci crée une table nommée <literal>ma_premiere_table</literal> avec |
|---|
| 94 |
deux colonnes. La première colonne est nommée |
|---|
| 95 |
<literal>premiere_colonne</literal> et a un type de données |
|---|
| 96 |
<type>text</type> ; la seconde colonne porte le nom |
|---|
| 97 |
<literal>deuxieme_colonne</literal> et le type <type>integer</type>. |
|---|
| 98 |
Les noms de table et colonnes suivent la syntaxe d'identification expliquée |
|---|
| 99 |
dans <xref linkend="sql-syntax-identifiers">. Les noms des types sont souvent |
|---|
| 100 |
aussi des identifiants mais il y a des exceptions. Notez que la liste des |
|---|
| 101 |
colonnes est séparée par des virgules et entourée par des parenthèses. |
|---|
| 102 |
</para> |
|---|
| 103 |
|
|---|
| 104 |
<para> |
|---|
| 105 |
Bien sur, l'exemple précédant est un peu tiré par les cheveux. Normalement, |
|---|
| 106 |
on donne aux tables et aux colonnes des noms indiquant quels types de données |
|---|
| 107 |
ils stockent. Alors voyons un exemple plus réaliste : |
|---|
| 108 |
<programlisting> |
|---|
| 109 |
CREATE TABLE produits ( |
|---|
| 110 |
no_produit integer, |
|---|
| 111 |
nom text, |
|---|
| 112 |
prix numeric |
|---|
| 113 |
); |
|---|
| 114 |
</programlisting> |
|---|
| 115 |
(Le type <type>numeric</type> peut stocker des composants fractionnels |
|---|
| 116 |
comme on pourrait s'y attendre de montants monétaires.) |
|---|
| 117 |
</para> |
|---|
| 118 |
|
|---|
| 119 |
<tip> |
|---|
| 120 |
<para> |
|---|
| 121 |
Quand vous créez des tables liées entre elles, il est prudent de choisir |
|---|
| 122 |
des règles de nommage pour les tables et les colonnes. Par exemple, il |
|---|
| 123 |
peut y avoir le choix d'utiliser des noms au pluriel ou au singulier |
|---|
| 124 |
pour les noms de table, chaque choix ayant les faveurs d'un théoricien |
|---|
| 125 |
ou d'un autre. |
|---|
| 126 |
</para> |
|---|
| 127 |
</tip> |
|---|
| 128 |
|
|---|
| 129 |
<para> |
|---|
| 130 |
Il y a une limite sur le nombre de colonnes qu'une table peut contenir. |
|---|
| 131 |
Suivant le type de colonne, elle peut être entre 250 et 1600. |
|---|
| 132 |
Par contre, définir une table avec un nombre de colonnes proche de ceux-ci |
|---|
| 133 |
est très inhabituel et est souvent la preuve d'une conception douteuse. |
|---|
| 134 |
</para> |
|---|
| 135 |
|
|---|
| 136 |
<indexterm> |
|---|
| 137 |
<primary>table</primary> |
|---|
| 138 |
<secondary>suppression</secondary> |
|---|
| 139 |
</indexterm> |
|---|
| 140 |
|
|---|
| 141 |
<para> |
|---|
| 142 |
Si vous n'avez plus besoin d'une table, vous pouvez la retirer en utilisant |
|---|
| 143 |
la commande <command>DROP TABLE</command>. Par exemple : |
|---|
| 144 |
<programlisting> |
|---|
| 145 |
DROP TABLE ma_premiere_table; |
|---|
| 146 |
DROP TABLE produits; |
|---|
| 147 |
</programlisting> |
|---|
| 148 |
Tenter de supprimer une table qui n'existe pas est une erreur. |
|---|
| 149 |
Malgré cela, il est habituel dans des fichiers de scripts SQL d'essayer |
|---|
| 150 |
de supprimer chaque table avant de la créer, tout en ignorant les messages |
|---|
| 151 |
d'erreur. |
|---|
| 152 |
</para> |
|---|
| 153 |
|
|---|
| 154 |
<para> |
|---|
| 155 |
Si vous avez besoin de modifier une table qui existe déjà, regardez <xref |
|---|
| 156 |
linkend="ddl-alter"> plus loin dans ce chapitre. |
|---|
| 157 |
</para> |
|---|
| 158 |
|
|---|
| 159 |
<para> |
|---|
| 160 |
Avec les outils dont nous avons déjà discuté, vous pouvez créer des tables |
|---|
| 161 |
fonctionnelles. Le reste de ce chapitre est consacré à l'ajout de fonctionnalités, |
|---|
| 162 |
à la définition de tables pour garantir l'intégrité des données, la sécurité |
|---|
| 163 |
ou la facilité. Si vous êtes impatients de remplir vos tables avec des données |
|---|
| 164 |
tout de suite, vous pouvez sauter au <xref linkend="dml"> et lire le reste de |
|---|
| 165 |
ce chapitre plus tard. |
|---|
| 166 |
</para> |
|---|
| 167 |
</sect1> |
|---|
| 168 |
|
|---|
| 169 |
<sect1 id="ddl-default"> |
|---|
| 170 |
<title>Valeurs par défaut</title> |
|---|
| 171 |
|
|---|
| 172 |
<indexterm zone="ddl-default"> |
|---|
| 173 |
<primary>valeur par défaut</primary> |
|---|
| 174 |
</indexterm> |
|---|
| 175 |
|
|---|
| 176 |
<para> |
|---|
| 177 |
On peut attribuer une valeur par défaut à une colonne. Quant une nouvelle |
|---|
| 178 |
rangée est créée et aucune valeur n'est spécifiée pour certaines de ses |
|---|
| 179 |
colonnes, celles-ci sont remplies avec leur valeur par défaut respective. |
|---|
| 180 |
Une commande de manipulation de données peut aussi demander explicitement |
|---|
| 181 |
qu'une colonne soit mise à sa valeur par défaut sans avoir à connaître la |
|---|
| 182 |
valeur en question. (Les détails sur les commandes de manipulation de données |
|---|
| 183 |
sont dans <xref linkend="dml">.) |
|---|
| 184 |
</para> |
|---|
| 185 |
|
|---|
| 186 |
<para> |
|---|
| 187 |
<indexterm><primary>valeur NULL</primary><secondary>valeur par défaut</secondary></indexterm> |
|---|
| 188 |
Si aucune valeur par défaut n'est déclarée explicitement, la valeur |
|---|
| 189 |
par défaut est la valeur NULL. Ceci est d'habitude cohérent car on |
|---|
| 190 |
peut considérer que la valeur NULL représente des données inconnues. |
|---|
| 191 |
</para> |
|---|
| 192 |
|
|---|
| 193 |
<para> |
|---|
| 194 |
Dans une définition de table, les valeurs par défaut sont listées après |
|---|
| 195 |
le type de donnée de la colonne. Par exemple: |
|---|
| 196 |
<programlisting> |
|---|
| 197 |
CREATE TABLE products ( |
|---|
| 198 |
product_no integer, |
|---|
| 199 |
name text, |
|---|
| 200 |
price numeric <emphasis>DEFAULT 9.99</emphasis> |
|---|
| 201 |
); |
|---|
| 202 |
</programlisting> |
|---|
| 203 |
</para> |
|---|
| 204 |
|
|---|
| 205 |
<para> |
|---|
| 206 |
La valeur par défaut peut être une expression, qui |
|---|
| 207 |
sera évaluée à l'insertion de la valeur par défaut |
|---|
| 208 |
(<emphasis>pas</emphasis> à la création de la table.) Un exemple habituel |
|---|
| 209 |
est qu'une colonne de type timestamp pourrait avoir une valeur par défaut |
|---|
| 210 |
<literal>now()</>, de façon à ce qu'il obtienne la valeur de l'heure au |
|---|
| 211 |
moment de l'insertion. Un autre exemple habituel est la génération d'un |
|---|
| 212 |
<quote>numéro de série</> pour chaque ligne. |
|---|
| 213 |
Dans <productname>PostgreSQL</productname>, ceci se fait habituellement par |
|---|
| 214 |
quelque chose comme |
|---|
| 215 |
<programlisting> |
|---|
| 216 |
CREATE TABLE products ( |
|---|
| 217 |
product_no integer <emphasis>DEFAULT nextval('products_product_no_seq')</emphasis>, |
|---|
| 218 |
... |
|---|
| 219 |
); |
|---|
| 220 |
</programlisting> |
|---|
| 221 |
où la fonction <literal>nextval()</> fournit des valeurs successives à |
|---|
| 222 |
partir d'une <firstterm>objet séquence</> (voir <xref |
|---|
| 223 |
linkend="functions-sequence">). Cet arrangement est suffisamment commun |
|---|
| 224 |
pour qu'il y ait un raccourci pour lui : |
|---|
| 225 |
<programlisting> |
|---|
| 226 |
CREATE TABLE products ( |
|---|
| 227 |
product_no <emphasis>SERIAL</emphasis>, |
|---|
| 228 |
... |
|---|
| 229 |
); |
|---|
| 230 |
</programlisting> |
|---|
| 231 |
Le raccourci <literal>SERIAL</> est discuté plus tard dans <xref |
|---|
| 232 |
linkend="datatype-serial">. |
|---|
| 233 |
</para> |
|---|
| 234 |
</sect1> |
|---|
| 235 |
|
|---|
| 236 |
<sect1 id="ddl-constraints"> |
|---|
| 237 |
<title>Contraintes</title> |
|---|
| 238 |
|
|---|
| 239 |
<indexterm zone="ddl-constraints"> |
|---|
| 240 |
<primary>contrainte</primary> |
|---|
| 241 |
</indexterm> |
|---|
| 242 |
|
|---|
| 243 |
<para> |
|---|
| 244 |
Les types de données sont un moyen de limiter ce qui peut être stocké |
|---|
| 245 |
dans une table. Pour beaucoup d'applications, par contre, la contrainte |
|---|
| 246 |
qu'elles appliquent sont trop fortes. Par exemple, une colonne qui |
|---|
| 247 |
contient le prix d'un produit ne devrait accepter que des valeurs |
|---|
| 248 |
positives. Mais il n'y a pas de type de données qui n'acceptent que |
|---|
| 249 |
des valeurs positives. Un autre problème est le fait de vouloir limiter |
|---|
| 250 |
les données d'une colonne par rapport à d'autres colonnes ou rangées. |
|---|
| 251 |
Par exemple, dans une table contenant des informations de produit, il |
|---|
| 252 |
ne devrait y avoir qu'une rangée pour chaque numéro de produit. |
|---|
| 253 |
</para> |
|---|
| 254 |
|
|---|
| 255 |
<para> |
|---|
| 256 |
Dans ce but, SQL vous permet de définir les contraintes sur les colonnes |
|---|
| 257 |
et les tables. Les contraintes vous donnent autant de contrôle sur les |
|---|
| 258 |
données de vos tables que vous désirez. Si un utilisateur tente de stocker |
|---|
| 259 |
des données dans une colonne qui violerait un contrainte, une erreur est |
|---|
| 260 |
soulevée. Ceci s'applique même si la valeur vient de la définition de la |
|---|
| 261 |
valeur par défaut. |
|---|
| 262 |
</para> |
|---|
| 263 |
|
|---|
| 264 |
<sect2> |
|---|
| 265 |
<title>Contraintes de Vérification</title> |
|---|
| 266 |
|
|---|
| 267 |
<indexterm> |
|---|
| 268 |
<primary>contrainte de vérification</primary> |
|---|
| 269 |
</indexterm> |
|---|
| 270 |
|
|---|
| 271 |
<indexterm> |
|---|
| 272 |
<primary>contrainte</primary> |
|---|
| 273 |
<secondary>vérification</secondary> |
|---|
| 274 |
</indexterm> |
|---|
| 275 |
|
|---|
| 276 |
<para> |
|---|
| 277 |
Une contrainte de vérification est le type de contrainte le plus |
|---|
| 278 |
générique qui soit. Elle vous permet de spécifier l'expression |
|---|
| 279 |
d'une certaine colonne doit satisfaire une expression booléenne. Par |
|---|
| 280 |
exemple, pour obliger des prix de produits positifs, on pourrait |
|---|
| 281 |
utiliser : |
|---|
| 282 |
<programlisting> |
|---|
| 283 |
CREATE TABLE products ( |
|---|
| 284 |
product_no integer, |
|---|
| 285 |
name text, |
|---|
| 286 |
price numeric <emphasis>CHECK (price > 0)</emphasis> |
|---|
| 287 |
); |
|---|
| 288 |
</programlisting> |
|---|
| 289 |
</para> |
|---|
| 290 |
|
|---|
| 291 |
<para> |
|---|
| 292 |
Comme vous pouvez le voir, la définition de contrainte vient après |
|---|
| 293 |
le type de données comme les définitions de valeur par défaut. Les |
|---|
| 294 |
valeurs par défaut et les contraintes peuvent être données dans |
|---|
| 295 |
n'importe quel ordre. Une contrainte de vérification s'utilise avec |
|---|
| 296 |
le mot clé <literal>CHECK</literal> suivi d'une expression entre |
|---|
| 297 |
parenthèses. L'expression de contrainte de vérification peut |
|---|
| 298 |
impliquer la colonne ainsi contrainte, sinon la contrainte n'aurait |
|---|
| 299 |
pas beaucoup de sens. |
|---|
| 300 |
</para> |
|---|
| 301 |
|
|---|
| 302 |
<indexterm> |
|---|
| 303 |
<primary>contrainte</primary> |
|---|
| 304 |
<secondary>nom</secondary> |
|---|
| 305 |
</indexterm> |
|---|
| 306 |
|
|---|
| 307 |
<para> |
|---|
| 308 |
Vous pouvez aussi donner à la contrainte un nom diffèrent. Ceci |
|---|
| 309 |
clarifie les messages d'erreur et vous permet de faire référence |
|---|
| 310 |
à la contrainte lorsque vous avez besoin de la modifier. |
|---|
| 311 |
La syntaxe est: |
|---|
| 312 |
<programlisting> |
|---|
| 313 |
CREATE TABLE products ( |
|---|
| 314 |
product_no integer, |
|---|
| 315 |
name text, |
|---|
| 316 |
price numeric <emphasis>CONSTRAINT positive_price</emphasis> CHECK (price > 0) |
|---|
| 317 |
); |
|---|
| 318 |
</programlisting> |
|---|
| 319 |
Alors, pour spécifier une contrainte nommée, utilisez le mot-clé |
|---|
| 320 |
<literal>CONSTRAINT</literal> suivi d'un identifiant et de la |
|---|
| 321 |
définition de contrainte. (Si vous ne donnez pas de nom à la contrainte, |
|---|
| 322 |
le système choisira un nom pour vous.) |
|---|
| 323 |
</para> |
|---|
| 324 |
|
|---|
| 325 |
<para> |
|---|
| 326 |
Une contrainte de vérification peut faire référence à plusieurs |
|---|
| 327 |
colonnes. Admettons que vous souhaitez stocker un prix normal et un |
|---|
| 328 |
prix de promotion et, être sur que le prix de |
|---|
| 329 |
promotion soit inférieur au prix normal. |
|---|
| 330 |
<programlisting> |
|---|
| 331 |
CREATE TABLE products ( |
|---|
| 332 |
product_no integer, |
|---|
| 333 |
name text, |
|---|
| 334 |
price numeric CHECK (price > 0), |
|---|
| 335 |
discounted_price numeric CHECK (discounted_price > 0), |
|---|
| 336 |
<emphasis>CHECK (price > discounted_price)</emphasis> |
|---|
| 337 |
); |
|---|
| 338 |
</programlisting> |
|---|
| 339 |
</para> |
|---|
| 340 |
|
|---|
| 341 |
<para> |
|---|
| 342 |
Les deux premières contraintes devrait vous être familières. La troisième |
|---|
| 343 |
utilise une nouvelle syntaxe. Elle n'est pas attachée à une colonne |
|---|
| 344 |
particulière, elle apparaît comme un élément distinct dans |
|---|
| 345 |
la liste de colonnes séparées par des virgules. Les définitions de |
|---|
| 346 |
colonnes et ces définitions de contraintes peut être définies dans |
|---|
| 347 |
un ordre quelconque. |
|---|
| 348 |
</para> |
|---|
| 349 |
|
|---|
| 350 |
<para> |
|---|
| 351 |
On dit que les deux premières contraintes sont des contraintes de |
|---|
| 352 |
colonnes tandis que la troisième est une contrainte de table parce |
|---|
| 353 |
qu'elle est écrite séparément de toute définition de colonne tandis que |
|---|
| 354 |
l'inverse n'est pas forcément possible car une contrainte de colonne est |
|---|
| 355 |
supposé faire uniquement référence à la colonne à laquelle elle est |
|---|
| 356 |
attachée. (<productname>PostgreSQL</productname> ne force pas cette règle |
|---|
| 357 |
mais vous devriez la suivre si vous voulez que les définitions de votre |
|---|
| 358 |
table fonctionnent avec d'autres systèmes de bases de données.) |
|---|
| 359 |
L'exemple ci-dessus aurait pu s'écrire : |
|---|
| 360 |
<programlisting> |
|---|
| 361 |
CREATE TABLE products ( |
|---|
| 362 |
product_no integer, |
|---|
| 363 |
name text, |
|---|
| 364 |
price numeric, |
|---|
| 365 |
CHECK (price > 0), |
|---|
| 366 |
discounted_price numeric, |
|---|
| 367 |
CHECK (discounted_price > 0), |
|---|
| 368 |
CHECK (price > discounted_price) |
|---|
| 369 |
); |
|---|
| 370 |
</programlisting> |
|---|
| 371 |
ou même |
|---|
| 372 |
<programlisting> |
|---|
| 373 |
CREATE TABLE products ( |
|---|
| 374 |
product_no integer, |
|---|
| 375 |
name text, |
|---|
| 376 |
price numeric CHECK (price > 0), |
|---|
| 377 |
discounted_price numeric, |
|---|
| 378 |
CHECK (discounted_price > 0 AND price > discounted_price) |
|---|
| 379 |
); |
|---|
| 380 |
</programlisting> |
|---|
| 381 |
C'est une question de goût. |
|---|
| 382 |
</para> |
|---|
| 383 |
|
|---|
| 384 |
<para> |
|---|
| 385 |
Des noms peuvent être affectés à des contraintes de table de la même |
|---|
| 386 |
façon que les contraintes de colonne : |
|---|
| 387 |
<programlisting> |
|---|
| 388 |
CREATE TABLE products ( |
|---|
| 389 |
product_no integer, |
|---|
| 390 |
name text, |
|---|
| 391 |
price numeric, |
|---|
| 392 |
CHECK (price > 0), |
|---|
| 393 |
discounted_price numeric, |
|---|
| 394 |
CHECK (discounted_price > 0), |
|---|
| 395 |
<emphasis>CONSTRAINT valid_discount</> CHECK (price > discounted_price) |
|---|
| 396 |
); |
|---|
| 397 |
</programlisting> |
|---|
| 398 |
</para> |
|---|
| 399 |
|
|---|
| 400 |
<indexterm> |
|---|
| 401 |
<primary>valeur NULL</primary> |
|---|
| 402 |
<secondary sortas="check constraints">avec contraintes de vérification</secondary> |
|---|
| 403 |
</indexterm> |
|---|
| 404 |
|
|---|
| 405 |
<para> |
|---|
| 406 |
Il faut noter qu'une contrainte de vérification est satisfaite si |
|---|
| 407 |
l'expression est évaluée à vrai ou la valeur NULL. Puisque la |
|---|
| 408 |
plupart des expressions seront évaluées à la valeur NULL si l'un |
|---|
| 409 |
des opérandes est NULL, elles n'empêchent pas les valeurs NULL |
|---|
| 410 |
dans les colonnes contraintes. Pour s'assurer qu'une colonne ne |
|---|
| 411 |
contient pas de valeurs NULL, la contrainte non-NULL décrite |
|---|
| 412 |
dans la section suivante peut être utilisée. |
|---|
| 413 |
</para> |
|---|
| 414 |
</sect2> |
|---|
| 415 |
|
|---|
| 416 |
<sect2> |
|---|
| 417 |
<title>Contraintes Non NULL</title> |
|---|
| 418 |
|
|---|
| 419 |
<indexterm> |
|---|
| 420 |
<primary>contrainte non NULL</primary> |
|---|
| 421 |
</indexterm> |
|---|
| 422 |
|
|---|
| 423 |
<indexterm> |
|---|
| 424 |
<primary>contrainte</primary> |
|---|
| 425 |
<secondary>NOT NULL</secondary> |
|---|
| 426 |
</indexterm> |
|---|
| 427 |
|
|---|
| 428 |
<para> |
|---|
| 429 |
Une contrainte non NULL dit simplement qu'une colonne ne peut |
|---|
| 430 |
pas prendre la valeur NULL. Un exemple de syntaxe: |
|---|
| 431 |
<programlisting> |
|---|
| 432 |
CREATE TABLE products ( |
|---|
| 433 |
product_no integer <emphasis>NOT NULL</emphasis>, |
|---|
| 434 |
name text <emphasis>NOT NULL</emphasis>, |
|---|
| 435 |
price numeric |
|---|
| 436 |
); |
|---|
| 437 |
</programlisting> |
|---|
| 438 |
</para> |
|---|
| 439 |
|
|---|
| 440 |
<para> |
|---|
| 441 |
Une contrainte non NULL est toujours écrite comme une contrainte de |
|---|
| 442 |
colonne. Une contrainte non NULL est l'équivalente fonctionnelle de |
|---|
| 443 |
créer une contrainte <literal>CHECK (<replaceable>nom_colonne</replaceable> |
|---|
| 444 |
IS NOT NULL)</literal>, mais dans <productname>PostgreSQL</productname>, |
|---|
| 445 |
créer une contrainte explicitement non NULL est plus efficace. |
|---|
| 446 |
L'inconvénient est que vous ne pouvez pas donner de noms explicites |
|---|
| 447 |
à des contraintes non NULL créées de cette manière. |
|---|
| 448 |
</para> |
|---|
| 449 |
|
|---|
| 450 |
<para> |
|---|
| 451 |
Bien sur, une colonne peut avoir plus d'une contrainte. Écrivez juste |
|---|
| 452 |
les contraintes les unes après les autres: |
|---|
| 453 |
<programlisting> |
|---|
| 454 |
CREATE TABLE products ( |
|---|
| 455 |
product_no integer NOT NULL, |
|---|
| 456 |
name text NOT NULL, |
|---|
| 457 |
price numeric NOT NULL CHECK (price > 0) |
|---|
| 458 |
); |
|---|
| 459 |
</programlisting> |
|---|
| 460 |
L'ordre n'importe pas. Il ne détermine pas dans quel ordre les contraintes |
|---|
| 461 |
seront vérifiées. |
|---|
| 462 |
</para> |
|---|
| 463 |
|
|---|
| 464 |
<para> |
|---|
| 465 |
La contrainte <literal>NOT NULL</literal> a un opposé; la contrainte |
|---|
| 466 |
<literal>NULL</literal> . Ceci ne veut pas dire que la colonne doit |
|---|
| 467 |
être NULL, ce qui serait inutile. À la place, ceci sélectionne le comportement |
|---|
| 468 |
par défaut que la colonne doit être NULL. La contrainte <literal>NULL |
|---|
| 469 |
</literal> n'est pas définie dans le standard SQL et ne devrait pas |
|---|
| 470 |
être utilisé dans des applications portables. (Elle n'a été ajoutée |
|---|
| 471 |
dans <productname>PostgreSQL</productname> que pour assurer la |
|---|
| 472 |
compatibilité avec d'autres bases de données.) Certains utilisateurs |
|---|
| 473 |
l'apprécient car elle facilite le fait d'activer une contrainte |
|---|
| 474 |
dans un fichier de script. Par exemple, vous pourriez commencer avec: |
|---|
| 475 |
<programlisting> |
|---|
| 476 |
CREATE TABLE products ( |
|---|
| 477 |
product_no integer NULL, |
|---|
| 478 |
name text NULL, |
|---|
| 479 |
price numeric NULL |
|---|
| 480 |
); |
|---|
| 481 |
</programlisting> |
|---|
| 482 |
et puis insérer le mot-clé <literal>NOT</literal> suivant vos besoins. |
|---|
| 483 |
</para> |
|---|
| 484 |
|
|---|
| 485 |
<tip> |
|---|
| 486 |
<para> |
|---|
| 487 |
Dans beaucoup de conceptions de bases de données, la majorité des |
|---|
| 488 |
colonnes devraient être marquées non NULL. |
|---|
| 489 |
</para> |
|---|
| 490 |
</tip> |
|---|
| 491 |
</sect2> |
|---|
| 492 |
|
|---|
| 493 |
<sect2> |
|---|
| 494 |
<title>Contraintes Uniques</title> |
|---|
| 495 |
|
|---|
| 496 |
<indexterm> |
|---|
| 497 |
<primary>contrainte unique</primary> |
|---|
| 498 |
</indexterm> |
|---|
| 499 |
|
|---|
| 500 |
<indexterm> |
|---|
| 501 |
<primary>contrainte</primary> |
|---|
| 502 |
<secondary>unique</secondary> |
|---|
| 503 |
</indexterm> |
|---|
| 504 |
|
|---|
| 505 |
<para> |
|---|
| 506 |
Les contraintes uniques garantissent que les données contenues dans |
|---|
| 507 |
la colonne ou un groupe de colonnes est unique par rapport à toutes |
|---|
| 508 |
les rangées dans la table. La syntaxe est: |
|---|
| 509 |
<programlisting> |
|---|
| 510 |
CREATE TABLE products ( |
|---|
| 511 |
product_no integer <emphasis>UNIQUE</emphasis>, |
|---|
| 512 |
name text, |
|---|
| 513 |
price numeric |
|---|
| 514 |
); |
|---|
| 515 |
</programlisting> |
|---|
| 516 |
est écrit comme contrainte de colonne et |
|---|
| 517 |
<programlisting> |
|---|
| 518 |
CREATE TABLE products ( |
|---|
| 519 |
product_no integer, |
|---|
| 520 |
name text, |
|---|
| 521 |
price numeric, |
|---|
| 522 |
<emphasis>UNIQUE (product_no)</emphasis> |
|---|
| 523 |
); |
|---|
| 524 |
</programlisting> |
|---|
| 525 |
est écrit comme contrainte de table. |
|---|
| 526 |
</para> |
|---|
| 527 |
|
|---|
| 528 |
<para> |
|---|
| 529 |
Si une contrainte unique fait référence à un groupe de colonnes, |
|---|
| 530 |
celles-ci sont listées séparées par des virgules: |
|---|
| 531 |
<programlisting> |
|---|
| 532 |
CREATE TABLE exemple ( |
|---|
| 533 |
a integer, |
|---|
| 534 |
b integer, |
|---|
| 535 |
c integer, |
|---|
| 536 |
<emphasis>UNIQUE (a, c)</emphasis> |
|---|
| 537 |
); |
|---|
| 538 |
</programlisting> |
|---|
| 539 |
Ceci spécifie que la combinaison de valeurs dans les colonnes indiquées |
|---|
| 540 |
est unique pour toute la table bien qu'une seule des colonnes puisse ne |
|---|
| 541 |
pas être (et habituellement n'est pas) unique. |
|---|
| 542 |
</para> |
|---|
| 543 |
|
|---|
| 544 |
<para> |
|---|
| 545 |
Vous pouvez affecter votre propre nom pour une contrainte unique, de la |
|---|
| 546 |
façon habituelle : |
|---|
| 547 |
<programlisting> |
|---|
| 548 |
CREATE TABLE products ( |
|---|
| 549 |
product_no integer <emphasis>CONSTRAINT must_be_different</emphasis> UNIQUE, |
|---|
| 550 |
name text, |
|---|
| 551 |
price numeric |
|---|
| 552 |
); |
|---|
| 553 |
</programlisting> |
|---|
| 554 |
</para> |
|---|
| 555 |
|
|---|
| 556 |
<indexterm> |
|---|
| 557 |
<primary>valeur NULL</primary> |
|---|
| 558 |
<secondary sortas="unique constraints">avec contrainte unique</secondary> |
|---|
| 559 |
</indexterm> |
|---|
| 560 |
|
|---|
| 561 |
<para> |
|---|
| 562 |
En général, une contrainte unique est violée lorsqu'il y a au |
|---|
| 563 |
moins deux rangées dans une table ou la valeur de toutes les |
|---|
| 564 |
colonnes inclus dans la contrainte sont |
|---|
| 565 |
égales. Par contre, les valeurs NULL ne sont pas assimilées |
|---|
| 566 |
à une égalités dans cette comparaison. Ceci veut dire qu'il est possible |
|---|
| 567 |
de stocker un nombre illimité de rangées qui contiennent une |
|---|
| 568 |
valeur NULL dans au moins l'une des colonnes contraintes. Ce |
|---|
| 569 |
comportement est conforme au standard SQL mais nous avons |
|---|
| 570 |
été informé que d'autres bases SQL ne suivent pas cette règle. Alors, |
|---|
| 571 |
soyez prudents en développant des applications qui sont prévues |
|---|
| 572 |
pour être portable. |
|---|
| 573 |
</para> |
|---|
| 574 |
</sect2> |
|---|
| 575 |
|
|---|
| 576 |
<sect2> |
|---|
| 577 |
<title>Clés Primaires</title> |
|---|
| 578 |
|
|---|
| 579 |
<indexterm> |
|---|
| 580 |
<primary>clé primaire</primary> |
|---|
| 581 |
</indexterm> |
|---|
| 582 |
|
|---|
| 583 |
<indexterm> |
|---|
| 584 |
<primary>contrainte</primary> |
|---|
| 585 |
<secondary>clé primaire</secondary> |
|---|
| 586 |
</indexterm> |
|---|
| 587 |
|
|---|
| 588 |
<para> |
|---|
| 589 |
Techniquement, une contrainte de clé primaire est tout |
|---|
| 590 |
simplement une combinaison d'une contrainte unique et |
|---|
| 591 |
d'une contrainte non NULL. Donc, les définitions de |
|---|
| 592 |
tables suivantes accepteront les mêmes données: |
|---|
| 593 |
<programlisting> |
|---|
| 594 |
CREATE TABLE products ( |
|---|
| 595 |
product_no integer UNIQUE NOT NULL, |
|---|
| 596 |
name text, |
|---|
| 597 |
price numeric |
|---|
| 598 |
); |
|---|
| 599 |
</programlisting> |
|---|
| 600 |
|
|---|
| 601 |
<programlisting> |
|---|
| 602 |
CREATE TABLE products ( |
|---|
| 603 |
product_no integer <emphasis>PRIMARY KEY</emphasis>, |
|---|
| 604 |
name text, |
|---|
| 605 |
price numeric |
|---|
| 606 |
); |
|---|
| 607 |
</programlisting> |
|---|
| 608 |
</para> |
|---|
| 609 |
|
|---|
| 610 |
<para> |
|---|
| 611 |
Les clés primaires peuvent contraindre sur plus d'une colonne; la |
|---|
| 612 |
syntaxe est semblable aux contraintes uniques: |
|---|
| 613 |
<programlisting> |
|---|
| 614 |
CREATE TABLE exemple ( |
|---|
| 615 |
a integer, |
|---|
| 616 |
b integer, |
|---|
| 617 |
c integer, |
|---|
| 618 |
<emphasis>PRIMARY KEY (a, c)</emphasis> |
|---|
| 619 |
); |
|---|
| 620 |
</programlisting> |
|---|
| 621 |
</para> |
|---|
| 622 |
|
|---|
| 623 |
<para> |
|---|
| 624 |
Une clé primaire indique qu'une colonne ou un groupe de colonnes peuvent |
|---|
| 625 |
être utilisés comme identifiant unique pour les rangées de la table. (Ceci |
|---|
| 626 |
est une conséquence directe de la définition d'une clé primaire. Notez |
|---|
| 627 |
qu'une contrainte unique ne donne pas par elle-même, un identifiant unique |
|---|
| 628 |
car elle n'exclut pas les valeurs NULL.) Ceci est pratique à la fois |
|---|
| 629 |
pour des raisons de documentation et pour les applications clientes. Par |
|---|
| 630 |
exemple, une application graphique qui permet de modifier les valeurs de |
|---|
| 631 |
rangées a probablement besoin de connaître la clé primaire d'une table pour |
|---|
| 632 |
pouvoir identifier les rangées de manière unique correctement. |
|---|
| 633 |
</para> |
|---|
| 634 |
|
|---|
| 635 |
<para> |
|---|
| 636 |
Une table peut avoir au mieux une clé primaire (tandis qu'elle peut |
|---|
| 637 |
avoir plusieurs contraintes uniques et non NULL). La théorie des |
|---|
| 638 |
bases de données relationnelles dit que chaque table doit avoir |
|---|
| 639 |
une clé primaire. Cette règle n'est pas appliquée par |
|---|
| 640 |
<productname>PostgreSQL</productname>, mais il vaut mieux la respecter |
|---|
| 641 |
autant que possible. |
|---|
| 642 |
</para> |
|---|
| 643 |
</sect2> |
|---|
| 644 |
|
|---|
| 645 |
<sect2 id="ddl-constraints-fk"> |
|---|
| 646 |
<title>Clés Étrangères</title> |
|---|
| 647 |
|
|---|
| 648 |
<indexterm> |
|---|
| 649 |
<primary>clé étrangère</primary> |
|---|
| 650 |
</indexterm> |
|---|
| 651 |
|
|---|
| 652 |
<indexterm> |
|---|
| 653 |
<primary>contrainte</primary> |
|---|
| 654 |
<secondary>clé étrangère</secondary> |
|---|
| 655 |
</indexterm> |
|---|
| 656 |
|
|---|
| 657 |
<indexterm> |
|---|
| 658 |
<primary>intégrité référentielle</primary> |
|---|
| 659 |
</indexterm> |
|---|
| 660 |
|
|---|
| 661 |
<para> |
|---|
| 662 |
Une contrainte de clé étrangère stipule que les valeurs dans cette |
|---|
| 663 |
colonne (ou un groupe de colonnes) doit correspondre aux valeurs |
|---|
| 664 |
apparaissant dans des rangées d'une autre table. |
|---|
| 665 |
Nous disons que ceci maintient l'<firstterm>intégrité |
|---|
| 666 |
référentielle</firstterm> entre deux tables liées. |
|---|
| 667 |
</para> |
|---|
| 668 |
|
|---|
| 669 |
<para> |
|---|
| 670 |
Disons que vous avez la table de produits que nous avons déjà utilisé plusieurs fois: |
|---|
| 671 |
<programlisting> |
|---|
| 672 |
CREATE TABLE products ( |
|---|
| 673 |
product_no integer PRIMARY KEY, |
|---|
| 674 |
name text, |
|---|
| 675 |
price numeric |
|---|
| 676 |
); |
|---|
| 677 |
</programlisting> |
|---|
| 678 |
Disons aussi que vous avez une table stockant les commandes de |
|---|
| 679 |
ces produits. Nous voulons aussi nous assurer que la table des |
|---|
| 680 |
commandes ne contienne que des commandes concernant des produits |
|---|
| 681 |
qui existent réellement. Alors, nous définissons une contrainte |
|---|
| 682 |
de clé étrangère dans la table des commandes qui référence la |
|---|
| 683 |
table produit: |
|---|
| 684 |
<programlisting> |
|---|
| 685 |
CREATE TABLE orders ( |
|---|
| 686 |
order_id integer PRIMARY KEY, |
|---|
| 687 |
product_no integer <emphasis>REFERENCES products (product_no)</emphasis>, |
|---|
| 688 |
quantity integer |
|---|
| 689 |
); |
|---|
| 690 |
</programlisting> |
|---|
| 691 |
Maintenant, il est impossible de créer des commandes avec une entrée |
|---|
| 692 |
<structfield>product_no</structfield> qui n'apparaît pas dans la table products. |
|---|
| 693 |
</para> |
|---|
| 694 |
|
|---|
| 695 |
<para> |
|---|
| 696 |
Nous disons que, dans cette situation, la table de commandes est la table |
|---|
| 697 |
<firstterm>référente</firstterm> et la table products est la table |
|---|
| 698 |
<firstterm>référée</firstterm>. De la même façon, il y a des colonnes |
|---|
| 699 |
référentes et des colonnes référées. |
|---|
| 700 |
</para> |
|---|
| 701 |
|
|---|
| 702 |
<para> |
|---|
| 703 |
On peut aussi raccourcir la commande ci-dessus en |
|---|
| 704 |
<programlisting> |
|---|
| 705 |
CREATE TABLE orders ( |
|---|
| 706 |
order_id integer PRIMARY KEY, |
|---|
| 707 |
product_no integer <emphasis>REFERENCES products</emphasis>, |
|---|
| 708 |
quantity integer |
|---|
| 709 |
); |
|---|
| 710 |
</programlisting> |
|---|
| 711 |
parce qu'en l'absence d'une liste de colonnes, la clé primaire de la |
|---|
| 712 |
table référente est utilisée comme colonne référée. |
|---|
| 713 |
</para> |
|---|
| 714 |
|
|---|
| 715 |
<para> |
|---|
| 716 |
Une clé étrangère peut aussi contraindre et référencer un groupe de colonnes. |
|---|
| 717 |
Comme d'habitude, il faut aussi l'écrire sous forme de contrainte de table. |
|---|
| 718 |
Voici un exemple de syntaxe: |
|---|
| 719 |
<programlisting> |
|---|
| 720 |
CREATE TABLE t1 ( |
|---|
| 721 |
a integer PRIMARY KEY, |
|---|
| 722 |
b integer, |
|---|
| 723 |
c integer, |
|---|
| 724 |
<emphasis>FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)</emphasis> |
|---|
| 725 |
); |
|---|
| 726 |
</programlisting> |
|---|
| 727 |
Bien sûr, le nombre et le type des colonnes contraintes doivent correspondre |
|---|
| 728 |
au nombre et au type des colonnes référées. |
|---|
| 729 |
</para> |
|---|
| 730 |
|
|---|
| 731 |
<para> |
|---|
| 732 |
Vous pouvez affecter votre propre nom pour une contrainte de clé |
|---|
| 733 |
étrangère de la façon habituelle. |
|---|
| 734 |
</para> |
|---|
| 735 |
|
|---|
| 736 |
<para> |
|---|
| 737 |
Une table peut contenir plus d'une contrainte de clé étrangère. Ceci peut |
|---|
| 738 |
être utilisé pour implémenter des relations n à n entre tables. Disons |
|---|
| 739 |
que vous avez des tables contenant des produits et des commandes mais vous |
|---|
| 740 |
voulez maintenant autoriser une commande qui contient peut-être beaucoup |
|---|
| 741 |
de produits (ce que la structure ci-dessus ne permet pas). On pourrait |
|---|
| 742 |
utiliser cette structure de table: |
|---|
| 743 |
<programlisting> |
|---|
| 744 |
CREATE TABLE products ( |
|---|
| 745 |
product_no integer PRIMARY KEY, |
|---|
| 746 |
name text, |
|---|
| 747 |
price numeric |
|---|
| 748 |
); |
|---|
| 749 |
|
|---|
| 750 |
CREATE TABLE orders ( |
|---|
| 751 |
order_id integer PRIMARY KEY, |
|---|
| 752 |
shipping_address text, |
|---|
| 753 |
... |
|---|
| 754 |
); |
|---|
| 755 |
|
|---|
| 756 |
CREATE TABLE order_items ( |
|---|
| 757 |
product_no integer REFERENCES products, |
|---|
| 758 |
order_id integer REFERENCES orders, |
|---|
| 759 |
quantity integer, |
|---|
| 760 |
PRIMARY KEY (product_no, order_id) |
|---|
| 761 |
); |
|---|
| 762 |
</programlisting> |
|---|
| 763 |
Notez aussi que la clé primaire chevauche les clés étrangères dans la dernière table. |
|---|
| 764 |
</para> |
|---|
| 765 |
|
|---|
| 766 |
<indexterm> |
|---|
| 767 |
<primary>CASCADE</primary> |
|---|
| 768 |
<secondary>action clé étrangère</secondary> |
|---|
| 769 |
</indexterm> |
|---|
| 770 |
|
|---|
| 771 |
<indexterm> |
|---|
| 772 |
<primary>RESTRICT</primary> |
|---|
| 773 |
<secondary>action clé étrangère</secondary> |
|---|
| 774 |
</indexterm> |
|---|
| 775 |
|
|---|
| 776 |
<para> |
|---|
| 777 |
Nous savons que les clés étrangères n'autorisent pas la création |
|---|
| 778 |
de commandes qui ne sont pas liés à un produit. Et si un produit |
|---|
| 779 |
est retiré après qu'une commande qui y réfère soit créée ? SQL vous |
|---|
| 780 |
permet aussi de le gérer. Intuitivement, nous avons plusieurs options : |
|---|
| 781 |
<itemizedlist spacing="compact"> |
|---|
| 782 |
<listitem><para>Interdire d'effacer un produit référé</para></listitem> |
|---|
| 783 |
<listitem><para>Effacer aussi les commandes</para></listitem> |
|---|
| 784 |
<listitem><para>Autre chose ?</para></listitem> |
|---|
| 785 |
</itemizedlist> |
|---|
| 786 |
</para> |
|---|
| 787 |
|
|---|
| 788 |
<para> |
|---|
| 789 |
Pour illustrer ce cas, implémentons la politique suivante sur |
|---|
| 790 |
l'exemple de relations n à n évoquée plus haut: Quand quelqu'un |
|---|
| 791 |
veut retirer un produit qui est encore référencé par un ordre |
|---|
| 792 |
(via <literal>ordre_items</literal>), on l'interdit. Si quelqu'un |
|---|
| 793 |
retire une commande, les éléments de l'ordre sont aussi retirés. |
|---|
| 794 |
<programlisting> |
|---|
| 795 |
CREATE TABLE products ( |
|---|
| 796 |
product_no integer PRIMARY KEY, |
|---|
| 797 |
name text, |
|---|
| 798 |
price numeric |
|---|
| 799 |
); |
|---|
| 800 |
|
|---|
| 801 |
CREATE TABLE orders ( |
|---|
| 802 |
order_id integer PRIMARY KEY, |
|---|
| 803 |
shipping_address text, |
|---|
| 804 |
... |
|---|
| 805 |
); |
|---|
| 806 |
|
|---|
| 807 |
CREATE TABLE order_items ( |
|---|
| 808 |
product_no integer REFERENCES products <emphasis>ON DELETE RESTRICT</emphasis>, |
|---|
| 809 |
order_id integer REFERENCES orders <emphasis>ON DELETE CASCADE</emphasis>, |
|---|
| 810 |
quantity integer, |
|---|
| 811 |
PRIMARY KEY (product_no, order_id) |
|---|
| 812 |
); |
|---|
| 813 |
</programlisting> |
|---|
| 814 |
</para> |
|---|
| 815 |
|
|---|
| 816 |
<para> |
|---|
| 817 |
Restreindre les suppressions et supprimer en cascade sont les deux |
|---|
| 818 |
options les plus communes. <literal>RESTRICT</literal> empêche la |
|---|
| 819 |
suppression d'une ligne référencée. <literal>NO ACTION</literal> signifie |
|---|
| 820 |
que si des lignes de références existent lors de la vérification de la |
|---|
| 821 |
contrainte, une erreur est levée ceci est le comportement par |
|---|
| 822 |
défaut si vous n'avez rien spécifié. (La différence essentielle entre |
|---|
| 823 |
ces deux choix est que <literal>NO ACTION</literal> autorise la |
|---|
| 824 |
déférence de la vérification plus tard dans la transaction alors que |
|---|
| 825 |
<literal>RESTRICT</literal> ne le permet pas.) <literal>CASCADE</> |
|---|
| 826 |
spécifie que, quand une ligne référencée est supprimée, les lignes la |
|---|
| 827 |
référençant devraient aussi être automatiquement supprimées. Il existe |
|---|
| 828 |
deux autres options : <literal>SET NULL</literal> et <literal>SET |
|---|
| 829 |
DEFAULT</literal>. Celles-ci font que les colonnes de références soient |
|---|
| 830 |
initialisées à NULL ou à leur valeur par défaut, respectivement quand la |
|---|
| 831 |
ligne référencée est supprimée. Notez qu'elles ne vous excusent pas |
|---|
| 832 |
d'observer les contraintes. Par exemple, si une action spécifie |
|---|
| 833 |
<literal>SET DEFAULT</literal> mais que la valeur par défaut ne |
|---|
| 834 |
satisferait pas la clé étrangère, l'opération échouera. |
|---|
| 835 |
</para> |
|---|
| 836 |
|
|---|
| 837 |
<para> |
|---|
| 838 |
Sur le même principe que <literal>ON DELETE</literal>, il y a aussi |
|---|
| 839 |
<literal>ON UPDATE</literal> qui est évoqué lorsqu'une colonne référencée |
|---|
| 840 |
est modifiée (mise à jour). Les actions possibles sont les mêmes. |
|---|
| 841 |
</para> |
|---|
| 842 |
|
|---|
| 843 |
<para> |
|---|
| 844 |
Il y a plus d'informations sur la mise à jour et la suppression de données dans <xref |
|---|
| 845 |
linkend="dml">. |
|---|
| 846 |
</para> |
|---|
| 847 |
|
|---|
| 848 |
<para> |
|---|
| 849 |
Enfin, nous devrions dire que la clé étrangère peut référencer |
|---|
| 850 |
des colonnes qui sont une clé primaire ou forment une contrainte unique. |
|---|
| 851 |
Si la clé étrangère référence une contrainte unique, il y a des |
|---|
| 852 |
possibilités supplémentaires selon que l'on souhaite faire correspondre |
|---|
| 853 |
les valeurs NULL. |
|---|
| 854 |
Ceux-ci sont expliqués dans la documentation de référence pour |
|---|
| 855 |
<xref linkend="sql-createtable" endterm="sql-createtable-title">. |
|---|
| 856 |
</para> |
|---|
| 857 |
</sect2> |
|---|
| 858 |
</sect1> |
|---|
| 859 |
|
|---|
| 860 |
<sect1 id="ddl-system-columns"> |
|---|
| 861 |
<title>Colonnes Systèmes</title> |
|---|
| 862 |
|
|---|
| 863 |
<para> |
|---|
| 864 |
Chaque table a plusieurs <firstterm>colonnes systèmes</> qui sont |
|---|
| 865 |
implicitement définis par le système. De ce fait, ces noms ne peuvent |
|---|
| 866 |
être utilisés comme noms de colonnes définis par l'utilisateur. (Notez |
|---|
| 867 |
que ces restrictions sont différentes si le nom est un mot-clé ou |
|---|
| 868 |
pas ; citez un nom ne vous permettra pas d'échapper à ces |
|---|
| 869 |
restrictions.) Vous n'avez pas vraiment besoin de vous préoccuper de |
|---|
| 870 |
ces colonnes, simplement savoir qu'elles existent. |
|---|
| 871 |
</para> |
|---|
| 872 |
|
|---|
| 873 |
<indexterm> |
|---|
| 874 |
<primary>colonne</primary> |
|---|
| 875 |
<secondary>colonne système</secondary> |
|---|
| 876 |
</indexterm> |
|---|
| 877 |
|
|---|
| 878 |
<variablelist> |
|---|
| 879 |
<varlistentry> |
|---|
| 880 |
<term><structfield>oid</></term> |
|---|
| 881 |
<listitem> |
|---|
| 882 |
<para> |
|---|
| 883 |
<indexterm> |
|---|
| 884 |
<primary>OID</primary> |
|---|
| 885 |
<secondary>colonne</secondary> |
|---|
| 886 |
</indexterm> |
|---|
| 887 |
L'identifiant objet (<foreignphrase>object ID</>) d'une rangée. Ceci |
|---|
| 888 |
est un numéro de série qui est automatiquement rajouté par |
|---|
| 889 |
<productname>PostgreSQL</productname> à toutes les rangées de tables |
|---|
| 890 |
(sauf si la table a été créée avec <literal>WITHOUT OIDS</literal>, |
|---|
| 891 |
auquel cas cette colonne n'est pas présente). Cette colonne est de |
|---|
| 892 |
type oid (même nom que la colonne) ; voir la <xref |
|---|
| 893 |
linkend="datatype-oid"> pour plus d'informations sur ce type. |
|---|
| 894 |
</para> |
|---|
| 895 |
</listitem> |
|---|
| 896 |
</varlistentry> |
|---|
| 897 |
|
|---|
| 898 |
<varlistentry> |
|---|
| 899 |
<term><structfield>tableoid</></term> |
|---|
| 900 |
<listitem> |
|---|
| 901 |
<indexterm> |
|---|
| 902 |
<primary>tableoid</primary> |
|---|
| 903 |
</indexterm> |
|---|
| 904 |
|
|---|
| 905 |
<para> |
|---|
| 906 |
L' OID de la table contenant cette rangée. Cette colonne est |
|---|
| 907 |
particulièrement utile pour les requêtes qui sélectionnent de |
|---|
| 908 |
hiérarchies héritées, puisque sans elle, il est difficile de dire de |
|---|
| 909 |
quelle table vient une rangée. <structfield>tableoid</structfield> |
|---|
| 910 |
peut être joint à la colonne <structfield>oid</structfield> de |
|---|
| 911 |
<structname>pg_class</structname> pour obtenir le nom de la table. |
|---|
| 912 |
</para> |
|---|
| 913 |
</listitem> |
|---|
| 914 |
</varlistentry> |
|---|
| 915 |
|
|---|
| 916 |
<varlistentry> |
|---|
| 917 |
<term><structfield>xmin</></term> |
|---|
| 918 |
<listitem> |
|---|
| 919 |
<indexterm> |
|---|
| 920 |
<primary>xmin</primary> |
|---|
| 921 |
</indexterm> |
|---|
| 922 |
|
|---|
| 923 |
<para> |
|---|
| 924 |
L'identité (transaction ID) de la transaction d'insertion de cette |
|---|
| 925 |
version de la rangée. (Une version de rangée est un état individuel |
|---|
| 926 |
d'une rangée; chaque mise à jour d'une rangée crée une nouvelle |
|---|
| 927 |
version de rangée pour la même rangée logique.) |
|---|
| 928 |
</para> |
|---|
| 929 |
</listitem> |
|---|
| 930 |
</varlistentry> |
|---|
| 931 |
|
|---|
| 932 |
<varlistentry> |
|---|
| 933 |
<term><structfield>cmin</></term> |
|---|
| 934 |
<listitem> |
|---|
| 935 |
<indexterm> |
|---|
| 936 |
<primary>cmin</primary> |
|---|
| 937 |
</indexterm> |
|---|
| 938 |
|
|---|
| 939 |
<para> |
|---|
| 940 |
L'identifiant de commande (à partir de zéro) au sein de la transaction |
|---|
| 941 |
d'insertion. |
|---|
| 942 |
</para> |
|---|
| 943 |
</listitem> |
|---|
| 944 |
</varlistentry> |
|---|
| 945 |
|
|---|
| 946 |
<varlistentry> |
|---|
| 947 |
<term><structfield>xmax</></term> |
|---|
| 948 |
<listitem> |
|---|
| 949 |
<indexterm> |
|---|
| 950 |
<primary>xmax</primary> |
|---|
| 951 |
</indexterm> |
|---|
| 952 |
|
|---|
| 953 |
<para> |
|---|
| 954 |
L'identité (transaction ID) de la transaction de suppression, ou zéro |
|---|
| 955 |
pour une version de rangée non effacée. Il est possible pour cette |
|---|
| 956 |
colonne d'être non NULL dans une version de rangée visible: Ceci |
|---|
| 957 |
indique normalement que la transaction de suppression n'a pas été |
|---|
| 958 |
effectuée, ou qu'une tentative de suppression a été annulée. |
|---|
| 959 |
</para> |
|---|
| 960 |
</listitem> |
|---|
| 961 |
</varlistentry> |
|---|
| 962 |
|
|---|
| 963 |
<varlistentry> |
|---|
| 964 |
<term><structfield>cmax</></term> |
|---|
| 965 |
<listitem> |
|---|
| 966 |
<indexterm> |
|---|
| 967 |
<primary>cmax</primary> |
|---|
| 968 |
</indexterm> |
|---|
| 969 |
|
|---|
| 970 |
<para> |
|---|
| 971 |
L'identifiant de commande au sein d'une transaction de suppression, ou |
|---|
| 972 |
zéro. |
|---|
| 973 |
</para> |
|---|
| 974 |
</listitem> |
|---|
| 975 |
</varlistentry> |
|---|
| 976 |
|
|---|
| 977 |
<varlistentry> |
|---|
| 978 |
<term><structfield>ctid</></term> |
|---|
| 979 |
<listitem> |
|---|
| 980 |
<indexterm> |
|---|
| 981 |
<primary>ctid</primary> |
|---|
| 982 |
</indexterm> |
|---|
| 983 |
|
|---|
| 984 |
<para> |
|---|
| 985 |
La localisation physique de la version de rangée au sein de sa table. |
|---|
| 986 |
Notez que bien que le <structfield>ctid</structfield> peut être utilisé |
|---|
| 987 |
pour trouver la version de rangée très rapidement, le |
|---|
| 988 |
<structfield>ctid</structfield> d'une rangée changera chaque fois |
|---|
| 989 |
qu'il est mis à jour ou déplacé par la commande <command>VACUUM FULL</>. |
|---|
| 990 |
Donc, <structfield>ctid</structfield> est inutile en tant |
|---|
| 991 |
qu'identifiant de rangée à long terme. L'OID, ou encore mieux un numéro |
|---|
| 992 |
de série définie par l'utilisateur, devrait être utilisé pour |
|---|
| 993 |
identifier des rangées logiques. |
|---|
| 994 |
</para> |
|---|
| 995 |
</listitem> |
|---|
| 996 |
</varlistentry> |
|---|
| 997 |
</variablelist> |
|---|
| 998 |
|
|---|
| 999 |
<para> |
|---|
| 1000 |
Les OID sont des nombres de 32 bits et sont attribués d'un seul |
|---|
| 1001 |
compteur. Dans une base de données grande ou vieille, il est possible que |
|---|
| 1002 |
le compteur boucle sur lui-même. Donc il est peu pertinent de partir du |
|---|
| 1003 |
principe que les OID sont uniques, sauf si vous prenez les précautions |
|---|
| 1004 |
nécessaires. Si vous avez besoin d'identifier les lignes dans une table, |
|---|
| 1005 |
l'utilisation d'un générateur de séquence est fortement recommandée. |
|---|
| 1006 |
Néanmoins, les OID peuvent aussi être utilisés à condition que quelques |
|---|
| 1007 |
précautions soient prises : |
|---|
| 1008 |
|
|---|
| 1009 |
<itemizedlist> |
|---|
| 1010 |
<listitem> |
|---|
| 1011 |
<para> |
|---|
| 1012 |
Une contrainte unique devrait être créée sur la colonne OID de chaque |
|---|
| 1013 |
table pour laquelle l'OID sera utilisée pour identifier les lignes. |
|---|
| 1014 |
</para> |
|---|
| 1015 |
</listitem> |
|---|
| 1016 |
<listitem> |
|---|
| 1017 |
<para> |
|---|
| 1018 |
Les OID ne devraient jamais être supposés uniques entre tables ; |
|---|
| 1019 |
utilisez la combinaison de <structfield>tableoid</> et de l'OID de la |
|---|
| 1020 |
ligne si vous avez besoin d'un identifiant sur la base complète. |
|---|
| 1021 |
</para> |
|---|
| 1022 |
</listitem> |
|---|
| 1023 |
<listitem> |
|---|
| 1024 |
<para> |
|---|
| 1025 |
Les tables en question devraient être créées en utilisant <literal>WITH |
|---|
| 1026 |
OIDS</literal> pour s'assurer de la compatibilité avec les versions |
|---|
| 1027 |
futures de <productname>PostgreSQL</productname>. Il est planifié que |
|---|
| 1028 |
<literal>WITHOUT OIDS</> deviendra l'option par défaut. |
|---|
| 1029 |
</para> |
|---|
| 1030 |
</listitem> |
|---|
| 1031 |
</itemizedlist> |
|---|
| 1032 |
</para> |
|---|
| 1033 |
|
|---|
| 1034 |
<para> |
|---|
| 1035 |
Les identifiants de transaction sont aussi des nombres de 32 bits. Dans |
|---|
| 1036 |
une base de données de longue vie, il est possible pour les ID de |
|---|
| 1037 |
transaction de boucler sur eux-mêmes. Ceci n'est pas un problème fatal |
|---|
| 1038 |
avec des procédures de maintenance appropriées; voir le <xref |
|---|
| 1039 |
linkend="maintenance"> pour les détails. Il est, par contre, imprudent |
|---|
| 1040 |
de dépendre de l'aspect unique des ID de transaction à long terme (plus |
|---|
| 1041 |
d'un milliard de transactions). |
|---|
| 1042 |
</para> |
|---|
| 1043 |
|
|---|
| 1044 |
<para> |
|---|
| 1045 |
Les identifiants de commande sont aussi des nombres de 32 bits. Ceci |
|---|
| 1046 |
crée une limite dure de 2<superscript>32</> (4 milliards) commandes |
|---|
| 1047 |
<acronym>SQL</acronym> au sein d'une seule transaction. En pratique, |
|---|
| 1048 |
cette limite n'est pas un problème — notez que la limite est sur |
|---|
| 1049 |
le nombre de commandes <acronym>SQL</acronym>, pas le nombre de rangées |
|---|
| 1050 |
traitées. |
|---|
| 1051 |
</para> |
|---|
| 1052 |
</sect1> |
|---|
| 1053 |
|
|---|
| 1054 |
<sect1 id="ddl-inherit"> |
|---|
| 1055 |
<title>Héritage</title> |
|---|
| 1056 |
|
|---|
| 1057 |
<remark>Cette section doit être repensée. Une partie de cette |
|---|
| 1058 |
information doit aller dans les chapitres suivants.</remark> |
|---|
| 1059 |
|
|---|
| 1060 |
<para> |
|---|
| 1061 |
Créons deux tables. La table capitales contient les capitales |
|---|
| 1062 |
d'état qui sont aussi des villes. Naturellement, la table |
|---|
| 1063 |
capitales doit hériter de villes. |
|---|
| 1064 |
|
|---|
| 1065 |
<programlisting> |
|---|
| 1066 |
CREATE TABLE villes ( |
|---|
| 1067 |
nom text, |
|---|
| 1068 |
population float, |
|---|
| 1069 |
altitude int -- (in ft) |
|---|
| 1070 |
); |
|---|
| 1071 |
|
|---|
| 1072 |
CREATE TABLE capitales ( |
|---|
| 1073 |
etat char(2) |
|---|
| 1074 |
) INHERITS (villes); |
|---|
| 1075 |
</programlisting> |
|---|
| 1076 |
|
|---|
| 1077 |
Dans ce cas, une rangée de capitales <firstterm>hérite</firstterm> de tous |
|---|
| 1078 |
les attributs (nom, population, et altitude) de son parent |
|---|
| 1079 |
villes. Les capitales d'état ont un attribut supplémentaire state qui |
|---|
| 1080 |
donne leur état. Dans <productname>PostgreSQL</productname>, |
|---|
| 1081 |
une table peut hériter de zéro tables ou plus et une requête peut référencer |
|---|
| 1082 |
toutes les rangées d'une table ou toutes les rangées d'une table plus celles de |
|---|
| 1083 |
ses descendants. |
|---|
| 1084 |
|
|---|
| 1085 |
<note> |
|---|
| 1086 |
<para> |
|---|
| 1087 |
La hiérarchie d'héritage est en fait un graphe acyclique dirigé. |
|---|
| 1088 |
</para> |
|---|
| 1089 |
</note> |
|---|
| 1090 |
</para> |
|---|
| 1091 |
|
|---|
| 1092 |
<para> |
|---|
| 1093 |
Par exemple, la requête suivante cherche les noms de toutes les villes, |
|---|
| 1094 |
y compris les capitales d'état, qui se situent à une altitude de plus |
|---|
| 1095 |
de 500 pieds: |
|---|
| 1096 |
|
|---|
| 1097 |
<programlisting> |
|---|
| 1098 |
SELECT nom, altitude |
|---|
| 1099 |
FROM villes |
|---|
| 1100 |
WHERE altitude > 500; |
|---|
| 1101 |
</programlisting> |
|---|
| 1102 |
|
|---|
| 1103 |
qui retourne: |
|---|
| 1104 |
|
|---|
| 1105 |
<programlisting> |
|---|
| 1106 |
nom | altitude |
|---|
| 1107 |
-----------+---------- |
|---|
| 1108 |
Las Vegas | 2174 |
|---|
| 1109 |
Mariposa | 1953 |
|---|
| 1110 |
Madison | 845 |
|---|
| 1111 |
</programlisting> |
|---|
| 1112 |
</para> |
|---|
| 1113 |
|
|---|
| 1114 |
<para> |
|---|
| 1115 |
D'un autre côté, la requête suivante cherche toutes |
|---|
| 1116 |
les villes qui ne sont pas des capitales d'état et |
|---|
| 1117 |
qui sont situés à une altitude de plus de 500 pieds: |
|---|
| 1118 |
|
|---|
| 1119 |
<programlisting> |
|---|
| 1120 |
SELECT nom, altitude |
|---|
| 1121 |
FROM ONLY villes |
|---|
| 1122 |
WHERE altitude > 500; |
|---|
| 1123 |
|
|---|
| 1124 |
nom | altitude |
|---|
| 1125 |
-----------+---------- |
|---|
| 1126 |
Las Vegas | 2174 |
|---|
| 1127 |
Mariposa | 1953 |
|---|
| 1128 |
</programlisting> |
|---|
| 1129 |
</para> |
|---|
| 1130 |
|
|---|
| 1131 |
<para> |
|---|
| 1132 |
Ici, le <quote>ONLY</quote> avant villes indique que la requête ne devrait |
|---|
| 1133 |
être lancée que sur villes et non les tables en dessous de villes dans la |
|---|
| 1134 |
hiérarchie d'héritage. Beaucoup des commandes donc nous avons déjà discuté |
|---|
| 1135 |
-- <command>SELECT</command>, <command>UPDATE</command> et <command>DELETE</command> -- |
|---|
| 1136 |
gèrent cette syntaxe <quote>ONLY</quote>. |
|---|
| 1137 |
</para> |
|---|
| 1138 |
|
|---|
| 1139 |
<note> |
|---|
| 1140 |
<title>Obsolète</title> |
|---|
| 1141 |
<para> |
|---|
| 1142 |
Dans les précédentes versions de <productname>PostgreSQL</productname>, |
|---|
| 1143 |
le comportement par défaut était de ne pas inclure les tables enfants |
|---|
| 1144 |
dans les requêtes. Il a été prouvé que cela amenait facilement des |
|---|
| 1145 |
erreurs et est aussi en violation du standard SQL:1999. Avec l'ancienne |
|---|
| 1146 |
|---|