| 1 |
<?xml version="1.0" encoding="ISO-8859-15"?> |
|---|
| 2 |
<!-- Dernière modification |
|---|
| 3 |
le $Date$ |
|---|
| 4 |
par $Author$ |
|---|
| 5 |
révision $Revision$ --> |
|---|
| 6 |
|
|---|
| 7 |
<chapter id="ddl"> |
|---|
| 8 |
<title>Définition des données</title> |
|---|
| 9 |
|
|---|
| 10 |
<para> |
|---|
| 11 |
Ce chapitre couvre la création des structures de données amenées à contenir |
|---|
| 12 |
les données. Dans une base relationnelle, les données brutes |
|---|
| 13 |
sont stockées dans des tables. De ce fait, une grande partie de ce chapitre |
|---|
| 14 |
est consacrée à l'explication de la création et de la modification des tables |
|---|
| 15 |
et aux fonctionnalités disponibles pour contrôler les données stockées dans les tables. |
|---|
| 16 |
L'organisation des tables dans des schémas et l'attribution de privilèges |
|---|
| 17 |
sur les tables sont ensuite décrits. Pour finir, d'autres fonctionnalités, |
|---|
| 18 |
telles que l'héritage, les vues, les fonctions et les déclencheurs sont |
|---|
| 19 |
passées en revue. |
|---|
| 20 |
</para> |
|---|
| 21 |
|
|---|
| 22 |
<sect1 id="ddl-basics"> |
|---|
| 23 |
<title>Notions fondamentales sur les tables</title> |
|---|
| 24 |
|
|---|
| 25 |
<indexterm zone="ddl-basics"> |
|---|
| 26 |
<primary>table</primary> |
|---|
| 27 |
</indexterm> |
|---|
| 28 |
|
|---|
| 29 |
<indexterm> |
|---|
| 30 |
<primary>ligne</primary> |
|---|
| 31 |
</indexterm> |
|---|
| 32 |
|
|---|
| 33 |
<indexterm> |
|---|
| 34 |
<primary>colonne</primary> |
|---|
| 35 |
</indexterm> |
|---|
| 36 |
|
|---|
| 37 |
<para> |
|---|
| 38 |
Une table dans une base relationnelle ressemble beaucoup à un tableau |
|---|
| 39 |
sur papier : elle est constituée de lignes et de colonnes. Le nombre |
|---|
| 40 |
et l'ordre des colonnes sont fixes et chaque colonne a un nom. Le |
|---|
| 41 |
nombre de lignes est variable — il représente le nombre de données |
|---|
| 42 |
stockées à un instant donné. |
|---|
| 43 |
</para> |
|---|
| 44 |
<para> |
|---|
| 45 |
Le SQL n'apporte aucune garantie sur l'ordre des |
|---|
| 46 |
lignes dans une table. Quand une table est lue, les lignes |
|---|
| 47 |
apparaissent dans un ordre aléatoire, sauf si un tri est demandé |
|---|
| 48 |
explicitement. Tout cela est expliqué dans le <xref linkend="queries"/>. |
|---|
| 49 |
</para> |
|---|
| 50 |
<para> |
|---|
| 51 |
De plus, le SQL n'attribue pas d'identifiant unique aux lignes. Il est |
|---|
| 52 |
donc possible d'avoir plusieurs lignes identiques au sein d'une table. |
|---|
| 53 |
C'est une conséquence du modèle mathématique sur lequel repose le SQL, |
|---|
| 54 |
même si cela n'est habituellement pas souhaitable. |
|---|
| 55 |
Il est expliqué plus bas dans ce chapitre comment traiter ce problème. |
|---|
| 56 |
</para> |
|---|
| 57 |
|
|---|
| 58 |
<para> |
|---|
| 59 |
Chaque colonne a un type de données. Ce type limite l'ensemble |
|---|
| 60 |
de valeurs qu'il est possible d'attribuer à une colonne. Il attribue |
|---|
| 61 |
également une sémantique aux données stockées dans la colonne pour |
|---|
| 62 |
permettre les calculs sur celles-ci. Par exemple, une colonne déclarée dans un |
|---|
| 63 |
type numérique n'accepte pas les chaînes textuelles ; les données |
|---|
| 64 |
stockées dans une telle colonne peuvent être utilisées dans des |
|---|
| 65 |
calculs mathématiques. |
|---|
| 66 |
Par opposition, une colonne déclarée de type chaîne de |
|---|
| 67 |
caractères accepte pratiquement n'importe quel type de donnée mais ne |
|---|
| 68 |
se prête pas aux calculs mathématiques. D'autres types d'opérations, |
|---|
| 69 |
telle la concaténation de chaînes, sont cependant disponibles. |
|---|
| 70 |
</para> |
|---|
| 71 |
|
|---|
| 72 |
<para> |
|---|
| 73 |
<productname>PostgreSQL</productname> inclut un ensemble conséquent de types |
|---|
| 74 |
de données intégrés pour s'adapter à diverses applications. Les |
|---|
| 75 |
utilisateurs peuvent aussi définir leurs propres types de données. |
|---|
| 76 |
</para> |
|---|
| 77 |
<para> |
|---|
| 78 |
La plupart des types de données intégrés ont des noms et des sémantiques |
|---|
| 79 |
évidents. C'est pourquoi leur explication détaillée est reportée au |
|---|
| 80 |
<xref linkend="datatype"/>. |
|---|
| 81 |
</para> |
|---|
| 82 |
<!-- fractional : fraction --> |
|---|
| 83 |
<para> |
|---|
| 84 |
Parmi les types les plus utilisés, on trouve |
|---|
| 85 |
<type>integer</type> pour les entiers, <type>numeric</type> pour |
|---|
| 86 |
les éventuelles fractions, <type>text</type> pour les chaînes de |
|---|
| 87 |
caractères, <type>date</type> pour les dates, <type>time</type> pour |
|---|
| 88 |
les heures et <type>timestamp</type> pour les valeurs |
|---|
| 89 |
qui contiennent à la fois une date et une heure. |
|---|
| 90 |
</para> |
|---|
| 91 |
|
|---|
| 92 |
<indexterm> |
|---|
| 93 |
<primary>table</primary> |
|---|
| 94 |
<secondary>création</secondary> |
|---|
| 95 |
</indexterm> |
|---|
| 96 |
|
|---|
| 97 |
<!-- identifier : identifiant ou indicateur. Voire identificateur --> |
|---|
| 98 |
<para> |
|---|
| 99 |
Pour créer une table, on utilise la commande bien nommée |
|---|
| 100 |
<xref linkend="sql-createtable" endterm="sql-createtable-title"/>. Dans cette |
|---|
| 101 |
commande, il est nécessaire d'indiquer, au minimum, le nom de la |
|---|
| 102 |
table, les noms des colonnes et le type de données de chacune d'elles. |
|---|
| 103 |
Par exemple : |
|---|
| 104 |
<programlisting>CREATE TABLE ma_premiere_table ( |
|---|
| 105 |
premiere_colonne text, |
|---|
| 106 |
deuxieme_colonne integer |
|---|
| 107 |
);</programlisting> |
|---|
| 108 |
Cela crée une table nommée <literal>ma_premiere_table</literal> avec |
|---|
| 109 |
deux colonnes. La première colonne, nommée |
|---|
| 110 |
<literal>premiere_colonne</literal>, est de type <type>text</type> ; |
|---|
| 111 |
la seconde colonne, nommée <literal>deuxieme_colonne</literal>, est de type |
|---|
| 112 |
<type>integer</type>. |
|---|
| 113 |
Les noms des table et colonnes se conforment à la syntaxe des identifiants expliquée |
|---|
| 114 |
dans la <xref linkend="sql-syntax-identifiers"/>. Les noms des types sont souvent |
|---|
| 115 |
aussi des identifiants mais il existe des exceptions. Le séparateur de la |
|---|
| 116 |
liste des colonnes est la virgule. La liste doit être entre parenthèses. |
|---|
| 117 |
</para> |
|---|
| 118 |
|
|---|
| 119 |
<!-- capillo-tracté s'il s'agit donc de cheveux de traie ou simplifié à l'extrême --> |
|---|
| 120 |
<para> |
|---|
| 121 |
L'exemple qui précède est à l'évidence extrêmement simpliste. On donne |
|---|
| 122 |
habituellement aux tables et aux colonnes des noms qui indiquent les |
|---|
| 123 |
données stockées. L'exemple ci-dessous est un peu plus réaliste : |
|---|
| 124 |
<programlisting>CREATE TABLE produits ( |
|---|
| 125 |
no_produit integer, |
|---|
| 126 |
nom text, |
|---|
| 127 |
prix numeric |
|---|
| 128 |
);</programlisting> |
|---|
| 129 |
(Le type <type>numeric</type> peut stocker des fractions |
|---|
| 130 |
telles que les montants.) |
|---|
| 131 |
</para> |
|---|
| 132 |
|
|---|
| 133 |
<tip> |
|---|
| 134 |
<para> |
|---|
| 135 |
Quand de nombreuses tables liées sont créées, il est préférable de définir |
|---|
| 136 |
un motif cohérent pour le nommage des tables et des colonnes. On a ainsi |
|---|
| 137 |
la possibilité d'utiliser le pluriel ou le singulier des noms, chacune |
|---|
| 138 |
ayant ses fidèles et ses détracteurs. |
|---|
| 139 |
</para> |
|---|
| 140 |
</tip> |
|---|
| 141 |
|
|---|
| 142 |
<!-- Par contre, utilisé par Céline (pas Dion, mais Louis-Ferdinand) dans un |
|---|
| 143 |
souci de provocation, n'est à l'évidence pas une construction grammaticale |
|---|
| 144 |
préconisée par l'Académie Française. On lui préférera "En revanche", |
|---|
| 145 |
"Cependant", "Au contraire"... --> |
|---|
| 146 |
<para> |
|---|
| 147 |
Le nombre de colonnes d'un table est limité. En fonction du type de |
|---|
| 148 |
colonnes, il oscille entre 250 et 1600. |
|---|
| 149 |
Définir une table avec un nombre de colonnes proche de cette limite est, |
|---|
| 150 |
cependant, très inhabituel et doit conduire à se poser des questions quant |
|---|
| 151 |
à la conception du modèle. |
|---|
| 152 |
</para> |
|---|
| 153 |
|
|---|
| 154 |
<indexterm> |
|---|
| 155 |
<primary>table</primary> |
|---|
| 156 |
<secondary>suppression</secondary> |
|---|
| 157 |
</indexterm> |
|---|
| 158 |
|
|---|
| 159 |
<para> |
|---|
| 160 |
Lorsqu'une table n'est plus utile, elle peut être supprimée à l'aide de la |
|---|
| 161 |
commande <xref linkend="sql-droptable" endterm="sql-droptable-title"/>. Par exemple : |
|---|
| 162 |
<programlisting>DROP TABLE ma_premiere_table; |
|---|
| 163 |
DROP TABLE produits;</programlisting> |
|---|
| 164 |
Tenter de supprimer une table qui n'existe pas lève une erreur. |
|---|
| 165 |
Il est, néanmoins, habituel dans les fichiers de scripts SQL d'essayer |
|---|
| 166 |
de supprimer chaque table avant de la créer. Les messages |
|---|
| 167 |
d'erreur sont alors ignorés afin que le script fonctionne que la table |
|---|
| 168 |
existe ou non. (La variante <literal>DROP TABLE IF EXISTS</literal> peut |
|---|
| 169 |
aussi être utilisée pour éviter les messages d'erreur mais elle ne fait pas partie du |
|---|
| 170 |
standard SQL.) |
|---|
| 171 |
</para> |
|---|
| 172 |
|
|---|
| 173 |
<para> |
|---|
| 174 |
Pour la procéduure de modification d'une table qui existe déjà, voir la |
|---|
| 175 |
<xref linkend="ddl-alter"/> plus loin dans ce chapitre. |
|---|
| 176 |
</para> |
|---|
| 177 |
|
|---|
| 178 |
<para> |
|---|
| 179 |
Les outils précédemment décrits permettent de créer des tables |
|---|
| 180 |
fonctionnelles. Le reste de ce chapitre est consacré à l'ajout de fonctionnalités |
|---|
| 181 |
à la définition de tables pour garantir l'intégrité des données, la sécurité |
|---|
| 182 |
ou l'ergonomie. Le lecteur impatient d'insérer des données dans ses tables |
|---|
| 183 |
peut sauter au <xref linkend="dml"/> et lire le reste de |
|---|
| 184 |
ce chapitre plus tard. |
|---|
| 185 |
</para> |
|---|
| 186 |
</sect1> |
|---|
| 187 |
|
|---|
| 188 |
<sect1 id="ddl-default"> |
|---|
| 189 |
<title>Valeurs par défaut</title> |
|---|
| 190 |
|
|---|
| 191 |
<indexterm zone="ddl-default"> |
|---|
| 192 |
<primary>valeur par défaut</primary> |
|---|
| 193 |
</indexterm> |
|---|
| 194 |
|
|---|
| 195 |
<para> |
|---|
| 196 |
Une valeur par défaut peut être attribuée à une colonne. Quand une nouvelle |
|---|
| 197 |
ligne est créée et qu'aucune valeur n'est indiquée pour certaines de ses |
|---|
| 198 |
colonnes, celles-ci sont remplies avec leurs valeurs par défaut respectives. |
|---|
| 199 |
Une commande de manipulation de données peut aussi demander explicitement |
|---|
| 200 |
que la valeur d'une colonne soit positionnée à la valeur par défaut, sans |
|---|
| 201 |
qu'il lui soit nécessaire de connaître cette valeur (les détails concernant les |
|---|
| 202 |
commandes de manipulation de données sont donnés dans le <xref linkend="dml"/>). |
|---|
| 203 |
</para> |
|---|
| 204 |
|
|---|
| 205 |
<para> |
|---|
| 206 |
<indexterm> |
|---|
| 207 |
<primary>valeur NULL</primary> |
|---|
| 208 |
<secondary>valeur par défaut</secondary> |
|---|
| 209 |
</indexterm> |
|---|
| 210 |
Si aucune valeur par défaut n'est déclarée explicitement, la valeur |
|---|
| 211 |
par défaut est la valeur NULL. Cela a un sens dans la mesure où l'on |
|---|
| 212 |
peut considérer que la valeur NULL représente des données inconnues. |
|---|
| 213 |
</para> |
|---|
| 214 |
|
|---|
| 215 |
<para> |
|---|
| 216 |
Dans la définition d'une table, les valeurs par défaut sont listées après |
|---|
| 217 |
le type de données de la colonne. Par exemple: |
|---|
| 218 |
<programlisting>CREATE TABLE produits ( |
|---|
| 219 |
no_produit integer, |
|---|
| 220 |
nom text, |
|---|
| 221 |
prix numeric <emphasis>DEFAULT 9.99</emphasis> |
|---|
| 222 |
);</programlisting> |
|---|
| 223 |
</para> |
|---|
| 224 |
|
|---|
| 225 |
<para> |
|---|
| 226 |
La valeur par défaut peut être une expression, alors évaluée à l'insertion |
|---|
| 227 |
de cette valeur (<emphasis>pas</emphasis> à la création de la |
|---|
| 228 |
table). Un exemple commun est la colonne de type <type>timestamp</type> |
|---|
| 229 |
dont la valeur par défaut est <literal>now()</literal>. Elle se voit ainsi |
|---|
| 230 |
attribuée l'heure d'insertion. Un autre exemple est |
|---|
| 231 |
la génération d'un <quote>numéro de série</quote> pour chaque ligne. |
|---|
| 232 |
Dans <productname>PostgreSQL</productname>, cela s'obtient habituellement par |
|---|
| 233 |
quelque chose comme |
|---|
| 234 |
<programlisting>CREATE TABLE produits ( |
|---|
| 235 |
no_produit integer <emphasis>DEFAULT nextval('produits_no_produit_seq')</emphasis>, |
|---|
| 236 |
... |
|---|
| 237 |
);</programlisting> |
|---|
| 238 |
où la fonction <literal>nextval()</literal> fournit des valeurs successives à |
|---|
| 239 |
partir d'un <firstterm>objet séquence</firstterm> (voir la <xref |
|---|
| 240 |
linkend="functions-sequence"/>). Cet arrangement est suffisamment commun |
|---|
| 241 |
pour qu'il ait son propre raccourci : |
|---|
| 242 |
<programlisting>CREATE TABLE produits ( |
|---|
| 243 |
no_produit <emphasis>SERIAL</emphasis>, |
|---|
| 244 |
... |
|---|
| 245 |
);</programlisting> |
|---|
| 246 |
Le raccourci <literal>SERIAL</literal> est discuté plus tard dans la <xref |
|---|
| 247 |
linkend="datatype-serial"/>. |
|---|
| 248 |
</para> |
|---|
| 249 |
</sect1> |
|---|
| 250 |
|
|---|
| 251 |
<sect1 id="ddl-constraints"> |
|---|
| 252 |
<title>Contraintes</title> |
|---|
| 253 |
|
|---|
| 254 |
<indexterm zone="ddl-constraints"> |
|---|
| 255 |
<primary>contrainte</primary> |
|---|
| 256 |
</indexterm> |
|---|
| 257 |
|
|---|
| 258 |
<para> |
|---|
| 259 |
Les types de données sont un moyen de restreindre la nature des données qui |
|---|
| 260 |
peuvent être stockées dans une table. Pour beaucoup d'applications, |
|---|
| 261 |
toutefois, la contrainte fournie par ce biais est trop grossière. |
|---|
| 262 |
Par exemple, une colonne qui |
|---|
| 263 |
contient le prix d'un produit ne doit accepter que des valeurs |
|---|
| 264 |
positives. Mais il n'existe pas de type de données standard qui n'accepte que |
|---|
| 265 |
des valeurs positives. Un autre problème peut provenir de la volonté de |
|---|
| 266 |
contraindre les données d'une colonne par rapport aux autres colonnes ou lignes. |
|---|
| 267 |
Par exemple, dans une table contenant des informations de produit, il |
|---|
| 268 |
ne peut y avoir qu'une ligne par numéro de produit. |
|---|
| 269 |
</para> |
|---|
| 270 |
|
|---|
| 271 |
<para> |
|---|
| 272 |
Pour cela, SQL permet de définir des contraintes sur les colonnes |
|---|
| 273 |
et les tables. Les contraintes donnent autant de contrôle sur les |
|---|
| 274 |
données des tables qu'un utilisateur peut le souhaiter. Si un utilisateur |
|---|
| 275 |
tente de stocker des données dans une colonne en violation d'une contrainte, une erreur est |
|---|
| 276 |
levée. Cela s'applique même si la valeur vient de la définition de la |
|---|
| 277 |
valeur par défaut. |
|---|
| 278 |
</para> |
|---|
| 279 |
|
|---|
| 280 |
<sect2> |
|---|
| 281 |
<title>Contraintes de vérification</title> |
|---|
| 282 |
|
|---|
| 283 |
<indexterm> |
|---|
| 284 |
<primary>contrainte de vérification</primary> |
|---|
| 285 |
</indexterm> |
|---|
| 286 |
|
|---|
| 287 |
<indexterm> |
|---|
| 288 |
<primary>contrainte</primary> |
|---|
| 289 |
<secondary>vérification</secondary> |
|---|
| 290 |
</indexterm> |
|---|
| 291 |
|
|---|
| 292 |
<para> |
|---|
| 293 |
La contrainte de vérification est la contrainte la plus |
|---|
| 294 |
générique qui soit. Elle permet d'indiquer que la valeur |
|---|
| 295 |
d'une colonne particulière doit satisfaire une expression booléenne |
|---|
| 296 |
(valeur de vérité). Par exemple, pour obliger les prix des produits |
|---|
| 297 |
à être positifs, on peut utiliser : |
|---|
| 298 |
<programlisting>CREATE TABLE produits ( |
|---|
| 299 |
no_produit integer, |
|---|
| 300 |
nom text, |
|---|
| 301 |
prix numeric <emphasis>CHECK (prix > 0)</emphasis> |
|---|
| 302 |
);</programlisting> |
|---|
| 303 |
</para> |
|---|
| 304 |
|
|---|
| 305 |
<para> |
|---|
| 306 |
La définition de contrainte vient après |
|---|
| 307 |
le type de données, comme pour les définitions de valeur par défaut. Les |
|---|
| 308 |
valeurs par défaut et les contraintes peuvent être données dans |
|---|
| 309 |
n'importe quel ordre. Une contrainte de vérification s'utilise avec |
|---|
| 310 |
le mot clé <literal>CHECK</literal> suivi d'une expression entre |
|---|
| 311 |
parenthèses. L'expression de la contrainte implique habituellement la |
|---|
| 312 |
colonne à laquelle elle s'applique, la contrainte n'ayant dans le cas |
|---|
| 313 |
contraire que peu de sens. |
|---|
| 314 |
</para> |
|---|
| 315 |
|
|---|
| 316 |
<indexterm> |
|---|
| 317 |
<primary>contrainte</primary> |
|---|
| 318 |
<secondary>nom</secondary> |
|---|
| 319 |
</indexterm> |
|---|
| 320 |
|
|---|
| 321 |
<para> |
|---|
| 322 |
la contrainte peut prendre un nom distinct. Cela |
|---|
| 323 |
clarifie les messages d'erreur et permet de faire référence |
|---|
| 324 |
à la contrainte lorsqu'elle doit être modifiée. |
|---|
| 325 |
La syntaxe est : |
|---|
| 326 |
<programlisting>CREATE TABLE produits ( |
|---|
| 327 |
no_produit integer, |
|---|
| 328 |
nom text, |
|---|
| 329 |
prix numeric <emphasis>CONSTRAINT prix_positif</emphasis> CHECK (prix > 0) |
|---|
| 330 |
);</programlisting> |
|---|
| 331 |
Pour indiquer une contrainte nommée, on utilise le mot-clé |
|---|
| 332 |
<literal>CONSTRAINT</literal> suivi d'un identifiant et de la |
|---|
| 333 |
définition de la contrainte (si aucun nom n'est précisé, |
|---|
| 334 |
le système en choisit un). |
|---|
| 335 |
</para> |
|---|
| 336 |
|
|---|
| 337 |
<para> |
|---|
| 338 |
Une contrainte de vérification peut aussi faire référence à plusieurs |
|---|
| 339 |
colonnes. Dans le cas d'un produit, on peut vouloir stocker le prix normal |
|---|
| 340 |
et un prix réduit en s'assurant que le prix réduit soit bien inférieur au |
|---|
| 341 |
prix normal. |
|---|
| 342 |
<programlisting>CREATE TABLE produits ( |
|---|
| 343 |
no_produit integer, |
|---|
| 344 |
nom text, |
|---|
| 345 |
prix numeric CHECK (prix > 0), |
|---|
| 346 |
prix_promotion numeric CHECK (prix_promotion > 0), |
|---|
| 347 |
<emphasis>CHECK (prix > prix_promotion)</emphasis> |
|---|
| 348 |
);</programlisting> |
|---|
| 349 |
</para> |
|---|
| 350 |
|
|---|
| 351 |
<para> |
|---|
| 352 |
Si les deux premières contraintes n'offrent pas de nouveauté, la troisième |
|---|
| 353 |
utilise une nouvelle syntaxe. Elle n'est pas attachée à une colonne |
|---|
| 354 |
particulière mais apparaît comme un élément distinct dans |
|---|
| 355 |
la liste des colonnes. Les définitions de |
|---|
| 356 |
colonnes et ces définitions de contraintes peuvent être définies dans |
|---|
| 357 |
un ordre quelconque. |
|---|
| 358 |
</para> |
|---|
| 359 |
|
|---|
| 360 |
<para> |
|---|
| 361 |
Les deux premières contraintes sont appelées contraintes de |
|---|
| 362 |
colonne tandis que la troisième est appelée contrainte de table parce |
|---|
| 363 |
qu'elle est écrite séparément d'une définition de colonne particulière. |
|---|
| 364 |
Les contraintes de colonne peuvent être écrites comme des contraintes de |
|---|
| 365 |
table, mais l'inverse n'est pas forcément possible puisqu'une contrainte de colonne est |
|---|
| 366 |
supposée ne faire référence qu'à la colonne à laquelle elle est |
|---|
| 367 |
attachée (<productname>PostgreSQL</productname> ne vérifie pas cette règle |
|---|
| 368 |
mais il est préférable de la suivre pour s'assurer que les définitions de |
|---|
| 369 |
tables fonctionnent avec d'autres systèmes de bases de données). |
|---|
| 370 |
L'exemple ci-dessus peut aussi s'écrire : |
|---|
| 371 |
<programlisting>CREATE TABLE produits ( |
|---|
| 372 |
no_produit integer, |
|---|
| 373 |
nom text, |
|---|
| 374 |
prix numeric, |
|---|
| 375 |
CHECK (prix > 0), |
|---|
| 376 |
prix_promotion numeric, |
|---|
| 377 |
CHECK (prix_promotion > 0), |
|---|
| 378 |
CHECK (prix > prix_promotion) |
|---|
| 379 |
);</programlisting> |
|---|
| 380 |
ou même : |
|---|
| 381 |
<programlisting>CREATE TABLE produits ( |
|---|
| 382 |
no_produit integer, |
|---|
| 383 |
nom text, |
|---|
| 384 |
prix numeric CHECK (prix > 0), |
|---|
| 385 |
prix_promotion numeric, |
|---|
| 386 |
CHECK (prix_promotion > 0 AND prix > prix_promotion) |
|---|
| 387 |
);</programlisting> |
|---|
| 388 |
C'est une question de goût. |
|---|
| 389 |
</para> |
|---|
| 390 |
|
|---|
| 391 |
<para> |
|---|
| 392 |
Les contraintes de table peuvent être nommées, tout comme |
|---|
| 393 |
les contraintes de colonne : |
|---|
| 394 |
<programlisting>CREATE TABLE produits ( |
|---|
| 395 |
no_produit integer, |
|---|
| 396 |
nom text, |
|---|
| 397 |
prix numeric, |
|---|
| 398 |
CHECK (prix > 0), |
|---|
| 399 |
prix_promotion numeric, |
|---|
| 400 |
CHECK (prix_promotion > 0), |
|---|
| 401 |
<emphasis>CONSTRAINT promo_valide</emphasis> CHECK (prix > prix_promotion) |
|---|
| 402 |
);</programlisting> |
|---|
| 403 |
</para> |
|---|
| 404 |
|
|---|
| 405 |
<indexterm> |
|---|
| 406 |
<primary>valeur NULL</primary> |
|---|
| 407 |
<secondary sortas="check constraints">avec contraintes de vérification</secondary> |
|---|
| 408 |
</indexterm> |
|---|
| 409 |
|
|---|
| 410 |
<para> |
|---|
| 411 |
Une contrainte de vérification est satisfaite si |
|---|
| 412 |
l'expression est évaluée vraie ou NULL. Puisque la |
|---|
| 413 |
plupart des expressions sont évaluées NULL si l'une |
|---|
| 414 |
des opérandes est nulle, elles n'interdisent pas les valeurs NULL |
|---|
| 415 |
dans les colonnes contraintes. Pour s'assurer qu'une colonne ne |
|---|
| 416 |
contient pas de valeurs NULL, la contrainte NOT NULL décrite |
|---|
| 417 |
dans la section suivante peut être utilisée. |
|---|
| 418 |
</para> |
|---|
| 419 |
</sect2> |
|---|
| 420 |
|
|---|
| 421 |
<sect2> |
|---|
| 422 |
<title>Contraintes de non nullité (NOT NULL)</title> |
|---|
| 423 |
|
|---|
| 424 |
<indexterm> |
|---|
| 425 |
<primary>contrainte NOT NULL</primary> |
|---|
| 426 |
</indexterm> |
|---|
| 427 |
|
|---|
| 428 |
<indexterm> |
|---|
| 429 |
<primary>contrainte</primary> |
|---|
| 430 |
<secondary>NOT NULL</secondary> |
|---|
| 431 |
</indexterm> |
|---|
| 432 |
|
|---|
| 433 |
<para> |
|---|
| 434 |
Une contrainte NOT NULL indique simplement qu'une colonne ne peut |
|---|
| 435 |
pas prendre la valeur NULL. Par exemple : |
|---|
| 436 |
<programlisting>CREATE TABLE produits ( |
|---|
| 437 |
no_produit integer <emphasis>NOT NULL</emphasis>, |
|---|
| 438 |
nom text <emphasis>NOT NULL</emphasis>, |
|---|
| 439 |
prix numeric |
|---|
| 440 |
);</programlisting> |
|---|
| 441 |
</para> |
|---|
| 442 |
|
|---|
| 443 |
<para> |
|---|
| 444 |
Une contrainte NOT NULL est toujours écrite comme une contrainte de |
|---|
| 445 |
colonne. Elle est fonctionnellement équivalente à la création d'une |
|---|
| 446 |
contrainte de vérification <literal>CHECK (<replaceable>nom_colonne</replaceable> |
|---|
| 447 |
IS NOT NULL)</literal>. Toutefois, dans <productname>PostgreSQL</productname>, |
|---|
| 448 |
il est plus efficace de créer explicitement une contrainte NOT NULL. |
|---|
| 449 |
L'inconvénient est que les contraintes de non-nullité ainsi créées ne |
|---|
| 450 |
peuvent pas être explicitement nommées. |
|---|
| 451 |
</para> |
|---|
| 452 |
|
|---|
| 453 |
<para> |
|---|
| 454 |
Une colonne peut évidemment avoir plusieurs contraintes. Il suffit |
|---|
| 455 |
d'écrire les contraintes les unes après les autres : |
|---|
| 456 |
<programlisting>CREATE TABLE produits ( |
|---|
| 457 |
no_produit integer NOT NULL, |
|---|
| 458 |
nom text NOT NULL, |
|---|
| 459 |
prix numeric NOT NULL CHECK (prix > 0) |
|---|
| 460 |
);</programlisting> |
|---|
| 461 |
L'ordre n'a aucune importance. Il ne détermine pas l'ordre de vérification |
|---|
| 462 |
des contraintes. |
|---|
| 463 |
</para> |
|---|
| 464 |
|
|---|
| 465 |
<para> |
|---|
| 466 |
La contrainte <literal>NOT NULL</literal> a un contraire ; la contrainte |
|---|
| 467 |
<literal>NULL</literal>. Elle ne signifie pas que la colonne doit |
|---|
| 468 |
être NULL, ce qui est assurément inutile, mais sélectionne le comportement |
|---|
| 469 |
par défaut, à savoir que la colonne peut être NULL. La contrainte |
|---|
| 470 |
<literal>NULL</literal> n'est pas présente dans le standard SQL et ne doit pas |
|---|
| 471 |
être utilisée dans des applications portables (elle n'a été ajoutée |
|---|
| 472 |
dans <productname>PostgreSQL</productname> que pour assurer la |
|---|
| 473 |
compatibilité avec d'autres bases de données). Certains utilisateurs |
|---|
| 474 |
l'apprécient néanmoins car elle permet de basculer aisément d'une |
|---|
| 475 |
contrainte à l'autre dans un fichier de script. On peut, par exemple, commencer avec : |
|---|
| 476 |
<programlisting>CREATE TABLE produits ( |
|---|
| 477 |
no_produit integer NULL, |
|---|
| 478 |
nom text NULL, |
|---|
| 479 |
prix numeric NULL |
|---|
| 480 |
);</programlisting> |
|---|
| 481 |
puis insérer le mot-clé <literal>NOT</literal> en fonction des besoins. |
|---|
| 482 |
</para> |
|---|
| 483 |
|
|---|
| 484 |
<tip> |
|---|
| 485 |
<para> |
|---|
| 486 |
Dans la plupart des bases de données, il est préférable que la majorité des |
|---|
| 487 |
colonnes soient marquées NOT NULL. |
|---|
| 488 |
</para> |
|---|
| 489 |
</tip> |
|---|
| 490 |
</sect2> |
|---|
| 491 |
|
|---|
| 492 |
<sect2> |
|---|
| 493 |
<title>Contraintes d'unicité</title> |
|---|
| 494 |
|
|---|
| 495 |
<indexterm> |
|---|
| 496 |
<primary>contrainte d'unicité</primary> |
|---|
| 497 |
</indexterm> |
|---|
| 498 |
|
|---|
| 499 |
<indexterm> |
|---|
| 500 |
<primary>contrainte</primary> |
|---|
| 501 |
<secondary>unicité</secondary> |
|---|
| 502 |
</indexterm> |
|---|
| 503 |
|
|---|
| 504 |
<para> |
|---|
| 505 |
Les contraintes d'unicité garantissent l'unicité des données contenues dans |
|---|
| 506 |
une colonne ou un groupe de colonnes par rapport à toutes |
|---|
| 507 |
les lignes de la table. La syntaxe est : |
|---|
| 508 |
<programlisting>CREATE TABLE produits ( |
|---|
| 509 |
no_produit integer <emphasis>UNIQUE</emphasis>, |
|---|
| 510 |
nom text, |
|---|
| 511 |
prix numeric |
|---|
| 512 |
);</programlisting> |
|---|
| 513 |
lorsque la contrainte est écrite comme contrainte de colonne et : |
|---|
| 514 |
<programlisting>CREATE TABLE produits ( |
|---|
| 515 |
no_produit integer, |
|---|
| 516 |
nom text, |
|---|
| 517 |
prix numeric, |
|---|
| 518 |
<emphasis>UNIQUE (no_produit)</emphasis> |
|---|
| 519 |
);</programlisting> |
|---|
| 520 |
lorsqu'elle est écrite comme contrainte de table. |
|---|
| 521 |
</para> |
|---|
| 522 |
|
|---|
| 523 |
<para> |
|---|
| 524 |
Lorsqu'une contrainte d'unicité fait référence à un groupe de colonnes, |
|---|
| 525 |
celles-ci sont listées séparées par des virgules : |
|---|
| 526 |
<programlisting>CREATE TABLE exemple ( |
|---|
| 527 |
a integer, |
|---|
| 528 |
b integer, |
|---|
| 529 |
c integer, |
|---|
| 530 |
<emphasis>UNIQUE (a, c)</emphasis> |
|---|
| 531 |
);</programlisting> |
|---|
| 532 |
Cela précise que la combinaison de valeurs dans les colonnes indiquées |
|---|
| 533 |
est unique sur toute la table. Sur une colonne prise isolément ce |
|---|
| 534 |
n'est pas nécessairement le cas (et habituellement cela ne l'est pas). |
|---|
| 535 |
</para> |
|---|
| 536 |
|
|---|
| 537 |
<para> |
|---|
| 538 |
Une contrainte d'unicité peut être nommée, de la |
|---|
| 539 |
façon habituelle : |
|---|
| 540 |
<programlisting>CREATE TABLE produits ( |
|---|
| 541 |
no_produit integer <emphasis>CONSTRAINT doit_etre_different</emphasis> UNIQUE, |
|---|
| 542 |
nom text, |
|---|
| 543 |
prix numeric |
|---|
| 544 |
);</programlisting> |
|---|
| 545 |
</para> |
|---|
| 546 |
|
|---|
| 547 |
<indexterm> |
|---|
| 548 |
<primary>valeur NULL</primary> |
|---|
| 549 |
<secondary sortas="unique constraints">avec contrainte d'unicité</secondary> |
|---|
| 550 |
</indexterm> |
|---|
| 551 |
|
|---|
| 552 |
<para> |
|---|
| 553 |
En général, une contrainte d'unicité est violée lorsqu'au moins deux |
|---|
| 554 |
lignes de la table possèdent des valeurs identiques sur toutes les |
|---|
| 555 |
colonnes de la contrainte. En revanche, deux valeurs NULL ne sont pas |
|---|
| 556 |
considérées égales. Cela signifie qu'il est possible |
|---|
| 557 |
de stocker des lignes dupliquées contenant une valeur NULL |
|---|
| 558 |
dans au moins une des colonnes contraintes. Ce comportement est conforme |
|---|
| 559 |
au standard SQL, mais d'autres bases SQL n'appliquent pas cette règle. |
|---|
| 560 |
Il est donc préférable d'être prudent lors du développement d'applications |
|---|
| 561 |
portables. |
|---|
| 562 |
</para> |
|---|
| 563 |
</sect2> |
|---|
| 564 |
|
|---|
| 565 |
<sect2> |
|---|
| 566 |
<title>Clés primaires</title> |
|---|
| 567 |
|
|---|
| 568 |
<indexterm> |
|---|
| 569 |
<primary>clé primaire</primary> |
|---|
| 570 |
</indexterm> |
|---|
| 571 |
|
|---|
| 572 |
<indexterm> |
|---|
| 573 |
<primary>contrainte</primary> |
|---|
| 574 |
<secondary>clé primaire</secondary> |
|---|
| 575 |
</indexterm> |
|---|
| 576 |
|
|---|
| 577 |
<para> |
|---|
| 578 |
Techniquement, une contrainte de clé primaire n'est |
|---|
| 579 |
que la combinaison d'une contrainte d'unicité et |
|---|
| 580 |
d'une contrainte NOT NULL. Les définitions de |
|---|
| 581 |
table suivantes acceptent de ce fait les mêmes données : |
|---|
| 582 |
<programlisting>CREATE TABLE produits ( |
|---|
| 583 |
no_produit integer UNIQUE NOT NULL, |
|---|
| 584 |
nom text, |
|---|
| 585 |
prix numeric |
|---|
| 586 |
);</programlisting> |
|---|
| 587 |
|
|---|
| 588 |
<programlisting>CREATE TABLE produits ( |
|---|
| 589 |
no_produit integer <emphasis>PRIMARY KEY</emphasis>, |
|---|
| 590 |
nom text, |
|---|
| 591 |
prix numeric |
|---|
| 592 |
);</programlisting> |
|---|
| 593 |
</para> |
|---|
| 594 |
|
|---|
| 595 |
<para> |
|---|
| 596 |
Les clés primaires peuvent également contraindre plusieurs colonnes ; la |
|---|
| 597 |
syntaxe est semblable aux contraintes d'unicité : |
|---|
| 598 |
<programlisting>CREATE TABLE exemple ( |
|---|
| 599 |
a integer, |
|---|
| 600 |
b integer, |
|---|
| 601 |
c integer, |
|---|
| 602 |
<emphasis>PRIMARY KEY (a, c)</emphasis> |
|---|
| 603 |
);</programlisting> |
|---|
| 604 |
</para> |
|---|
| 605 |
|
|---|
| 606 |
<para> |
|---|
| 607 |
Une clé primaire indique qu'une colonne ou un groupe de colonnes peut |
|---|
| 608 |
être utilisé(e) comme identifiant unique des lignes de la table. (C'est |
|---|
| 609 |
une conséquence directe de la définition d'une clé primaire. Une |
|---|
| 610 |
contrainte d'unicité ne suffit pas à fournir un identifiant unique |
|---|
| 611 |
car elle n'exclut pas les valeurs NULL). Ceci est utile à la fois |
|---|
| 612 |
pour des raisons documentaires et pour les applications clientes. Par |
|---|
| 613 |
exemple, une application graphique qui permet de modifier les valeurs de |
|---|
| 614 |
lignes a probablement besoin de connaître la clé primaire d'une table pour |
|---|
| 615 |
pouvoir identifier les lignes de manière unique. |
|---|
| 616 |
</para> |
|---|
| 617 |
|
|---|
| 618 |
<para> |
|---|
| 619 |
Une table a, au plus, une clé primaire. (Le nombre de contraintes UNIQUE NOT NULL, |
|---|
| 620 |
qui assurent la même fonction, n'est pas limité, mais une seule |
|---|
| 621 |
peut être identifiée comme clé primaire.) La théorie des |
|---|
| 622 |
bases de données relationnelles impose que chaque table ait |
|---|
| 623 |
une clé primaire. Cette règle n'est pas forcée par |
|---|
| 624 |
<productname>PostgreSQL</productname>, mais il est préférable de la |
|---|
| 625 |
respecter. |
|---|
| 626 |
</para> |
|---|
| 627 |
</sect2> |
|---|
| 628 |
|
|---|
| 629 |
<sect2 id="ddl-constraints-fk"> |
|---|
| 630 |
<title>Clés étrangères</title> |
|---|
| 631 |
|
|---|
| 632 |
<indexterm> |
|---|
| 633 |
<primary>clé étrangère</primary> |
|---|
| 634 |
</indexterm> |
|---|
| 635 |
|
|---|
| 636 |
<indexterm> |
|---|
| 637 |
<primary>contrainte</primary> |
|---|
| 638 |
<secondary>clé étrangère</secondary> |
|---|
| 639 |
</indexterm> |
|---|
| 640 |
|
|---|
| 641 |
<indexterm> |
|---|
| 642 |
<primary>intégrité référentielle</primary> |
|---|
| 643 |
</indexterm> |
|---|
| 644 |
|
|---|
| 645 |
<para> |
|---|
| 646 |
Une contrainte de clé étrangère stipule que les valeurs d'une |
|---|
| 647 |
colonne (ou d'un groupe de colonnes) doivent correspondre aux valeurs |
|---|
| 648 |
qui apparaissent dans les lignes d'une autre table. |
|---|
| 649 |
On dit que cela maintient l'<firstterm>intégrité référentielle</firstterm> |
|---|
| 650 |
entre les deux tables. |
|---|
| 651 |
</para> |
|---|
| 652 |
|
|---|
| 653 |
<para> |
|---|
| 654 |
Soit la table de produits, déjà utilisée plusieurs fois : |
|---|
| 655 |
<programlisting>CREATE TABLE produits ( |
|---|
| 656 |
no_produit integer PRIMARY KEY, |
|---|
| 657 |
nom text, |
|---|
| 658 |
prix numeric |
|---|
| 659 |
);</programlisting> |
|---|
| 660 |
Soit également une table qui stocke les commandes de |
|---|
| 661 |
ces produits. Il est intéressant de s'assurer que la table des |
|---|
| 662 |
commandes ne contient que des commandes de produits |
|---|
| 663 |
qui existent réellement. Pour cela, une contrainte |
|---|
| 664 |
de clé étrangère est définie dans la table des commandes qui référence la |
|---|
| 665 |
table produit : |
|---|
| 666 |
<programlisting>CREATE TABLE commandes ( |
|---|
| 667 |
id_commande integer PRIMARY KEY, |
|---|
| 668 |
no_produit integer <emphasis>REFERENCES produits (no_produit)</emphasis>, |
|---|
| 669 |
quantite integer |
|---|
| 670 |
);</programlisting> |
|---|
| 671 |
Il est désormais impossible de créer des commandes pour lesquelles |
|---|
| 672 |
<structfield>no_produit</structfield> n'apparaît pas dans la table |
|---|
| 673 |
produits. |
|---|
| 674 |
</para> |
|---|
| 675 |
<!-- referencing/referenced |
|---|
| 676 |
référençant/référencée ? --> |
|---|
| 677 |
<para> |
|---|
| 678 |
Dans cette situation, on dit que la table des commandes est la table |
|---|
| 679 |
<firstterm>qui référence</firstterm> et la table des produits est la table |
|---|
| 680 |
<firstterm>référencée</firstterm>. De la même façon, il y a des colonnes |
|---|
| 681 |
qui référencent et des colonnes référencées. |
|---|
| 682 |
</para> |
|---|
| 683 |
|
|---|
| 684 |
<para> |
|---|
| 685 |
La commande précédente peut être raccourcie en |
|---|
| 686 |
<programlisting>CREATE TABLE commandes ( |
|---|
| 687 |
id_commande integer PRIMARY KEY, |
|---|
| 688 |
no_produit integer <emphasis>REFERENCES produits</emphasis>, |
|---|
| 689 |
quantite integer |
|---|
| 690 |
);</programlisting> |
|---|
| 691 |
parce qu'en l'absence de liste de colonnes, la clé primaire de la |
|---|
| 692 |
table de référence est utilisée comme colonne de référence. |
|---|
| 693 |
</para> |
|---|
| 694 |
|
|---|
| 695 |
<para> |
|---|
| 696 |
Une clé étrangère peut aussi contraindre et référencer un groupe de colonnes. |
|---|
| 697 |
Comme cela a déjà été évoqué, il faut alors l'écrire sous forme d'une contrainte de table. |
|---|
| 698 |
Exemple de syntaxe : |
|---|
| 699 |
<programlisting>CREATE TABLE t1 ( |
|---|
| 700 |
a integer PRIMARY KEY, |
|---|
| 701 |
b integer, |
|---|
| 702 |
c integer, |
|---|
| 703 |
<emphasis>FOREIGN KEY (b, c) REFERENCES autre_table (c1, c2)</emphasis> |
|---|
| 704 |
);</programlisting> |
|---|
| 705 |
Le nombre et le type des colonnes contraintes doivent correspondre |
|---|
| 706 |
au nombre et au type des colonnes référencées. |
|---|
| 707 |
</para> |
|---|
| 708 |
|
|---|
| 709 |
<para> |
|---|
| 710 |
Une contrainte de clé étrangère peut être nommée de la façon habituelle. |
|---|
| 711 |
</para> |
|---|
| 712 |
|
|---|
| 713 |
<para> |
|---|
| 714 |
Une table peut contenir plusieurs contraintes de clé étrangère. Les |
|---|
| 715 |
relation n-n entre tables sont implantées ainsi. Soient |
|---|
| 716 |
des tables qui contiennent des produits et des commandes, avec la |
|---|
| 717 |
possibilité d'autoriser une commande à contenir plusieurs produits |
|---|
| 718 |
(ce que la structure ci-dessus ne permet pas). On peut pour cela |
|---|
| 719 |
utiliser la structure de table suivante : |
|---|
| 720 |
<programlisting>CREATE TABLE produits ( |
|---|
| 721 |
no_produit integer PRIMARY KEY, |
|---|
| 722 |
nom text, |
|---|
| 723 |
prix numeric |
|---|
| 724 |
); |
|---|
| 725 |
|
|---|
| 726 |
CREATE TABLE commandes ( |
|---|
| 727 |
id_commande integer PRIMARY KEY, |
|---|
| 728 |
adresse_de_livraison text, |
|---|
| 729 |
... |
|---|
| 730 |
); |
|---|
| 731 |
|
|---|
| 732 |
CREATE TABLE commande_produits ( |
|---|
| 733 |
no_produit integer REFERENCES produits, |
|---|
| 734 |
id_commande integer REFERENCES commandes, |
|---|
| 735 |
quantite integer, |
|---|
| 736 |
PRIMARY KEY (no_produit, id_commande) |
|---|
| 737 |
);</programlisting> |
|---|
| 738 |
La clé primaire de la dernière table recouvre les clés étrangères. |
|---|
| 739 |
</para> |
|---|
| 740 |
|
|---|
| 741 |
<indexterm> |
|---|
| 742 |
<primary>CASCADE</primary> |
|---|
| 743 |
<secondary>action clé étrangère</secondary> |
|---|
| 744 |
</indexterm> |
|---|
| 745 |
|
|---|
| 746 |
<indexterm> |
|---|
| 747 |
<primary>RESTRICT</primary> |
|---|
| 748 |
<secondary>action clé étrangère</secondary> |
|---|
| 749 |
</indexterm> |
|---|
| 750 |
|
|---|
| 751 |
<para> |
|---|
| 752 |
Les clés étrangères interdisent désormais la création |
|---|
| 753 |
de commandes qui ne soient pas liées à un produit. Qu'arrive-t-il si un produit |
|---|
| 754 |
est supprimé alors qu'une commande y fait référence ? SQL |
|---|
| 755 |
permet aussi de le gérer. Intuitivement, plusieurs options existent : |
|---|
| 756 |
<itemizedlist spacing="compact"> |
|---|
| 757 |
<listitem><para>interdire d'effacer un produit référencé ;</para></listitem> |
|---|
| 758 |
<listitem><para>effacer aussi les commandes ;</para></listitem> |
|---|
| 759 |
<listitem><para>autre chose ?</para></listitem> |
|---|
| 760 |
</itemizedlist> |
|---|
| 761 |
</para> |
|---|
| 762 |
|
|---|
| 763 |
<para> |
|---|
| 764 |
Pour illustrer ce cas, la politique suivante est implantée sur |
|---|
| 765 |
l'exemple de relations n-n évoqué plus haut : |
|---|
| 766 |
<itemizedlist spacing="compact"> |
|---|
| 767 |
<listitem><para>quand quelqu'un veut retirer un produit qui est encore |
|---|
| 768 |
référencé par une commande |
|---|
| 769 |
(au travers de <literal>commande_produits</literal>), on |
|---|
| 770 |
l'interdit ;</para></listitem> |
|---|
| 771 |
<listitem><para>si quelqu'un supprime une commande, les éléments |
|---|
| 772 |
de la commande sont aussi supprimés.</para></listitem> |
|---|
| 773 |
</itemizedlist> |
|---|
| 774 |
|
|---|
| 775 |
<programlisting>CREATE TABLE produits ( |
|---|
| 776 |
no_produit integer PRIMARY KEY, |
|---|
| 777 |
nom text, |
|---|
| 778 |
prix numeric |
|---|
| 779 |
); |
|---|
| 780 |
|
|---|
| 781 |
CREATE TABLE commandes ( |
|---|
| 782 |
id_commande integer PRIMARY KEY, |
|---|
| 783 |
adresse_de_livraison text, |
|---|
| 784 |
... |
|---|
| 785 |
); |
|---|
| 786 |
|
|---|
| 787 |
CREATE TABLE commande_produits ( |
|---|
| 788 |
no_produit integer REFERENCES produits <emphasis>ON DELETE RESTRICT</emphasis>, |
|---|
| 789 |
id_commande integer REFERENCES commandes <emphasis>ON DELETE CASCADE</emphasis>, |
|---|
| 790 |
quantite integer, |
|---|
| 791 |
PRIMARY KEY (no_produit, id_commande) |
|---|
| 792 |
);</programlisting> |
|---|
| 793 |
</para> |
|---|
| 794 |
|
|---|
| 795 |
<!-- CASCADE : cascader ? --> |
|---|
| 796 |
<para> |
|---|
| 797 |
Restreindre les suppressions et les cascader sont les deux |
|---|
| 798 |
options les plus communes. <literal>RESTRICT</literal> empêche la |
|---|
| 799 |
suppression d'une ligne référencée. <literal>NO ACTION</literal> impose |
|---|
| 800 |
la levée d'une erreur si des lignes référençant existent lors de la |
|---|
| 801 |
vérification de la contrainte. Il s'agit du comportement par |
|---|
| 802 |
défaut en l'absence de précision. La différence entre |
|---|
| 803 |
<literal>RESTRICT</literal> et <literal>NO ACTION</literal> |
|---|
| 804 |
est l'autorisation par |
|---|
| 805 |
<literal>NO ACTION</literal> du report de la vérification à la fin de la |
|---|
| 806 |
transaction, ce que <literal>RESTRICT</literal> ne permet pas. |
|---|
| 807 |
<literal>CASCADE</literal> indique que, lors de la suppression d'une ligne |
|---|
| 808 |
référencée, les lignes la référençant doivent être automatiquement |
|---|
| 809 |
supprimées. Il existe deux autres options : |
|---|
| 810 |
<literal>SET NULL</literal> et <literal>SET DEFAULT</literal>. |
|---|
| 811 |
Celles-ci imposent que les colonnes qui référencent soient |
|---|
| 812 |
réinitialisées à NULL ou à leur valeur par défaut, respectivement, lors |
|---|
| 813 |
de la suppression d'une ligne référencée. Elles ne dispensent pas pour |
|---|
| 814 |
autant d'observer les contraintes. Par exemple, si une action précise |
|---|
| 815 |
<literal>SET DEFAULT</literal> mais que la valeur par défaut ne |
|---|
| 816 |
satisfait pas la clé étrangère, l'opération échoue. |
|---|
| 817 |
</para> |
|---|
| 818 |
|
|---|
| 819 |
<para> |
|---|
| 820 |
À l'instar de <literal>ON DELETE</literal>, existe |
|---|
| 821 |
<literal>ON UPDATE</literal>, évoqué lorsqu'une colonne référencée |
|---|
| 822 |
est modifiée (actualisée). Les actions possibles sont les mêmes. |
|---|
| 823 |
</para> |
|---|
| 824 |
|
|---|
| 825 |
<para> |
|---|
| 826 |
Le <xref linkend="dml"/> contient de plus amples informations sur |
|---|
| 827 |
l'actualisation et la suppression de données. |
|---|
| 828 |
</para> |
|---|
| 829 |
|
|---|
| 830 |
<para> |
|---|
| 831 |
Une clé étrangère peut faire référence à des colonnes qui constituent une clé |
|---|
| 832 |
primaire ou forment une contrainte d'unicité. Si la clé étrangère référence |
|---|
| 833 |
une contrainte d'unicité, des possibilités supplémentaires sont offertes |
|---|
| 834 |
concernant la correspondance des valeurs NULL. Celles-ci sont expliquées |
|---|
| 835 |
dans la documentation de référence de |
|---|
| 836 |
<xref linkend="sql-createtable" endterm="sql-createtable-title"/>. |
|---|
| 837 |
</para> |
|---|
| 838 |
</sect2> |
|---|
| 839 |
</sect1> |
|---|
| 840 |
|
|---|
| 841 |
<sect1 id="ddl-system-columns"> |
|---|
| 842 |
<title>Colonnes système</title> |
|---|
| 843 |
|
|---|
| 844 |
<para> |
|---|
| 845 |
Chaque table contient plusieurs <firstterm>colonnes système</firstterm> |
|---|
| 846 |
implicitement définies par le système. De ce fait, leurs noms ne peuvent |
|---|
| 847 |
pas être utilisés comme noms de colonnes utilisateur (ces restrictions sont |
|---|
| 848 |
distinctes de celles sur l'utlisation de mot-clés ; mettre le nom |
|---|
| 849 |
entre guillemets ne permet pas d'échapper à cette règle). Il n'est pas |
|---|
| 850 |
vraiment utile de se préoccuper de ces colonnes, mais au minimum de |
|---|
| 851 |
savoir qu'elles existent. |
|---|
| 852 |
</para> |
|---|
| 853 |
|
|---|
| 854 |
<indexterm> |
|---|
| 855 |
<primary>colonne</primary> |
|---|
| 856 |
<secondary>colonne système</secondary> |
|---|
| 857 |
</indexterm> |
|---|
| 858 |
|
|---|
| 859 |
<variablelist> |
|---|
| 860 |
<varlistentry> |
|---|
| 861 |
<term><structfield>oid</structfield></term> |
|---|
| 862 |
<listitem> |
|---|
| 863 |
<para> |
|---|
| 864 |
<indexterm> |
|---|
| 865 |
<primary>OID</primary> |
|---|
| 866 |
<secondary>colonne</secondary> |
|---|
| 867 |
</indexterm> |
|---|
| 868 |
L'identifiant objet (<foreignphrase>object ID</foreignphrase>) d'une ligne. Cette |
|---|
| 869 |
colonne n'est présente que si la table a été créée en précisant |
|---|
| 870 |
<literal>WITH OIDS</literal> ou si la variable de configuration |
|---|
| 871 |
<xref linkend="guc-default-with-oids"/> était activée à ce moment-là. |
|---|
| 872 |
Cette colonne est de type oid (même nom que la colonne) ; voir la |
|---|
| 873 |
<xref linkend="datatype-oid"/> pour obtenir plus d'informations sur ce type. |
|---|
| 874 |
</para> |
|---|
| 875 |
</listitem> |
|---|
| 876 |
</varlistentry> |
|---|
| 877 |
|
|---|
| 878 |
<varlistentry> |
|---|
| 879 |
<term><structfield>tableoid</structfield></term> |
|---|
| 880 |
<listitem> |
|---|
| 881 |
<indexterm> |
|---|
| 882 |
<primary>tableoid</primary> |
|---|
| 883 |
</indexterm> |
|---|
| 884 |
|
|---|
| 885 |
<para> |
|---|
| 886 |
L' OID de la table contenant la ligne. Cette colonne est |
|---|
| 887 |
particulièrement utile pour les requêtes qui utilisent des hiérarchies |
|---|
| 888 |
d'héritage (voir <xref linkend="ddl-inherit"/>). Il est, en effet, |
|---|
| 889 |
difficile, en son absence, de savoir de quelle table provient une ligne. |
|---|
| 890 |
<structfield>tableoid</structfield> |
|---|
| 891 |
peut être joint à la colonne <structfield>oid</structfield> de |
|---|
| 892 |
<structname>pg_class</structname> pour obtenir le nom de la table. |
|---|
| 893 |
</para> |
|---|
| 894 |
</listitem> |
|---|
| 895 |
</varlistentry> |
|---|
| 896 |
|
|---|
| 897 |
<varlistentry> |
|---|
| 898 |
<term><structfield>xmin</structfield></term> |
|---|
| 899 |
<listitem> |
|---|
| 900 |
<indexterm> |
|---|
| 901 |
<primary>xmin</primary> |
|---|
| 902 |
</indexterm> |
|---|
| 903 |
|
|---|
| 904 |
<para> |
|---|
| 905 |
L'identifiant (ID de transaction) de la transaction qui a inséré cette |
|---|
| 906 |
version de la ligne. (Une version de ligne est un état individuel |
|---|
| 907 |
de la ligne ; toute mise à jour d'une ligne crée une nouvelle |
|---|
| 908 |
version de ligne pour la même ligne logique.) |
|---|
| 909 |
</para> |
|---|
| 910 |
</listitem> |
|---|
| 911 |
</varlistentry> |
|---|
| 912 |
|
|---|
| 913 |
<varlistentry> |
|---|
| 914 |
<term><structfield>cmin</structfield></term> |
|---|
| 915 |
<listitem> |
|---|
| 916 |
<indexterm> |
|---|
| 917 |
<primary>cmin</primary> |
|---|
| 918 |
</indexterm> |
|---|
| 919 |
|
|---|
| 920 |
<para> |
|---|
| 921 |
L'identifiant de commande (à partir de zéro) au sein de la transaction |
|---|
| 922 |
d'insertion. |
|---|
| 923 |
</para> |
|---|
| 924 |
</listitem> |
|---|
| 925 |
</varlistentry> |
|---|
| 926 |
|
|---|
| 927 |
<varlistentry> |
|---|
| 928 |
<term><structfield>xmax</structfield></term> |
|---|
| 929 |
<listitem> |
|---|
| 930 |
<indexterm> |
|---|
| 931 |
<primary>xmax</primary> |
|---|
| 932 |
</indexterm> |
|---|
| 933 |
|
|---|
| 934 |
<para> |
|---|
| 935 |
L'identifiant (ID de transaction) de la transaction de suppression, ou zéro |
|---|
| 936 |
pour une version de ligne non effacée. Il est possible que la colonne ne |
|---|
| 937 |
soit pas nulle pour une version de ligne visible ; cela |
|---|
| 938 |
indique habituellement que la transaction de suppression n'a pas été |
|---|
| 939 |
effectuée, ou qu'une tentative de suppression a été annulée. |
|---|
| 940 |
</para> |
|---|
| 941 |
</listitem> |
|---|
| 942 |
</varlistentry> |
|---|
| 943 |
|
|---|
| 944 |
<varlistentry> |
|---|
| 945 |
<term><structfield>cmax</structfield></term> |
|---|
| 946 |
<listitem> |
|---|
| 947 |
<indexterm> |
|---|
| 948 |
<primary>cmax</primary> |
|---|
| 949 |
</indexterm> |
|---|
| 950 |
|
|---|
| 951 |
<para> |
|---|
| 952 |
L'identifiant de commande au sein de la transaction de suppression, ou |
|---|
| 953 |
zéro. |
|---|
| 954 |
</para> |
|---|
| 955 |
</listitem> |
|---|
| 956 |
</varlistentry> |
|---|
| 957 |
|
|---|
| 958 |
<varlistentry> |
|---|
| 959 |
<term><structfield>ctid</structfield></term> |
|---|
| 960 |
<listitem> |
|---|
| 961 |
<indexterm> |
|---|
| 962 |
<primary>ctid</primary> |
|---|
| 963 |
</indexterm> |
|---|
| 964 |
|
|---|
| 965 |
<para> |
|---|
| 966 |
La localisation physique de la version de ligne au sein de sa table. |
|---|
| 967 |
Bien que le <structfield>ctid</structfield> puisse être utilisé |
|---|
| 968 |
pour trouver la version de ligne très rapidement, le |
|---|
| 969 |
<structfield>ctid</structfield> d'une ligne change si |
|---|
| 970 |
la ligne est actualisée ou déplacée par un <command>VACUUM FULL</command>. |
|---|
| 971 |
<structfield>ctid</structfield> est donc inutilisable comme |
|---|
| 972 |
identifiant de ligne sur le long terme. Il est préférable d'utiliser l'OID, |
|---|
| 973 |
ou, mieux encore, un numéro |
|---|
| 974 |
de série utilisateur, pour identifier les lignes logiques. |
|---|
| 975 |
</para> |
|---|
| 976 |
</listitem> |
|---|
| 977 |
</varlistentry> |
|---|
| 978 |
</variablelist> |
|---|
| 979 |
|
|---|
| 980 |
<para> |
|---|
| 981 |
Les OID sont des nombres de 32 bits et sont attribués à partir d'un |
|---|
| 982 |
compteur unique sur le cluster. Dans une base de données volumineuse ou |
|---|
| 983 |
agée, il est possible que le compteur boucle. Il est de ce fait peu |
|---|
| 984 |
pertinent de considérer que les OID puissent être uniques ; pour |
|---|
| 985 |
identifier les lignes d'une table, il est fortement recommandé d'utiliser |
|---|
| 986 |
un générateur de séquence. Néanmoins, les OID peuvent également être |
|---|
| 987 |
utilisés sous réserve que quelques précautions soient prises : |
|---|
| 988 |
|
|---|
| 989 |
<itemizedlist> |
|---|
| 990 |
<listitem> |
|---|
| 991 |
<para> |
|---|
| 992 |
une contrainte d'unicité doit être ajoutée sur la colonne OID de chaque |
|---|
| 993 |
table dont l'OID est utilisé pour identifier les lignes. |
|---|
| 994 |
Dans ce cas (ou dans celui d'un index d'unicité), le système |
|---|
| 995 |
n'engendre pas d'OID qui puisse correspondre à celui d'une ligne |
|---|
| 996 |
déjà présente. Cela n'est évidemment possible que si la table contient |
|---|
| 997 |
moins de 2<superscript>32</superscript> (4 milliards) lignes ; en pratique, la |
|---|
| 998 |
taille de la table a tout intérêt à être bien plus petite que ça, dans |
|---|
| 999 |
un souci de performance ; |
|---|
| 1000 |
</para> |
|---|
| 1001 |
</listitem> |
|---|
| 1002 |
<listitem> |
|---|
| 1003 |
<para> |
|---|
| 1004 |
l'unicité inter-tables des OID ne doit jamais être envisagée ; |
|---|
| 1005 |
pour obtenir un identifiant unique sur l'ensemble de la base, il faut |
|---|
| 1006 |
utiliser la combinaison du <structfield>tableoid</structfield> et de l'OID de |
|---|
| 1007 |
ligne ; |
|---|
| 1008 |
</para> |
|---|
| 1009 |
</listitem> |
|---|
| 1010 |
<listitem> |
|---|
| 1011 |
<para> |
|---|
| 1012 |
les tables en question doivent être créées avec l'option |
|---|
| 1013 |
<literal>WITH OIDS</literal>. Depuis <productname>PostgreSQL</productname> 8.1, |
|---|
| 1014 |
<literal>WITHOUT OIDS</literal> est l'option par défaut. |
|---|
| 1015 |
</para> |
|---|
| 1016 |
</listitem> |
|---|
| 1017 |
</itemizedlist> |
|---|
| 1018 |
</para> |
|---|
| 1019 |
|
|---|
| 1020 |
<para> |
|---|
| 1021 |
Les identifiants de transaction sont aussi des nombres de 32 bits. Dans |
|---|
| 1022 |
une base de données agée, il est possible que les ID de |
|---|
| 1023 |
transaction bouclent. Cela n'est pas un problème fatal |
|---|
| 1024 |
avec des procédures de maintenance appropriées ; voir le <xref |
|---|
| 1025 |
linkend="maintenance"/> pour les détails. Il est, en revanche, imprudent |
|---|
| 1026 |
de considérer l'unicité des ID de transaction sur le long terme (plus |
|---|
| 1027 |
d'un milliard de transactions). |
|---|
| 1028 |
</para> |
|---|
| 1029 |
|
|---|
| 1030 |
<para> |
|---|
| 1031 |
Les identifiants de commande sont aussi des nombres de 32 bits. Cela |
|---|
| 1032 |
crée une limite dure de 2<superscript>32</superscript> (4 milliards) |
|---|
| 1033 |
commandes <acronym>SQL</acronym> au sein d'une unique transaction. En |
|---|
| 1034 |
pratique, cette limite n'est pas un problème — la limite est sur |
|---|
| 1035 |
le nombre de commandes <acronym>SQL</acronym>, pas sur le nombre de lignes |
|---|
| 1036 |
traitées. |
|---|
| 1037 |
De plus, à partir de <productname>PostgreSQL</productname> 8.3, seules les |
|---|
| 1038 |
commandes qui modifient réellement le contenu de la base de données |
|---|
| 1039 |
consomment un identifiant de commande. |
|---|
| 1040 |
</para> |
|---|
| 1041 |
</sect1> |
|---|
| 1042 |
|
|---|
| 1043 |
<sect1 id="ddl-alter"> |
|---|
| 1044 |
<title>Modification des tables</title> |
|---|
| 1045 |
|
|---|
| 1046 |
<indexterm zone="ddl-alter"> |
|---|
| 1047 |
<primary>table</primary> |
|---|
| 1048 |
<secondary>modification</secondary> |
|---|
| 1049 |
</indexterm> |
|---|
| 1050 |
|
|---|
| 1051 |
<para> |
|---|
| 1052 |
Lorsqu'une table est créée et qu'une erreur a été commise ou que les |
|---|
| 1053 |
besoins de l'application changent, il est alors possible de la supprimer et |
|---|
| 1054 |
de la récréer. Cela n'est toutefois pas pratique si la table contient |
|---|
| 1055 |
déjà des données ou qu'elle est référencée par d'autres objets de la base |
|---|
| 1056 |
de données (une contrainte de clé étrangère, par exemple). C'est pourquoi |
|---|
| 1057 |
<productname>PostgreSQL</productname> offre une série de commandes |
|---|
| 1058 |
permettant de modifier une table existante. Cela n'a rien à voir |
|---|
| 1059 |
avec la modification des données contenues dans la table ; il ne |
|---|
| 1060 |
s'agit ici, que de modifier la définition, ou structure, de la table. |
|---|
| 1061 |
</para> |
|---|
| 1062 |
|
|---|
| 1063 |
<para> |
|---|
| 1064 |
Il est possible |
|---|
| 1065 |
<itemizedlist spacing="compact"> |
|---|
| 1066 |
<listitem> |
|---|
| 1067 |
<para>d'ajouter des colonnes ;</para> |
|---|
| 1068 |
</listitem> |
|---|
| 1069 |
<listitem> |
|---|
| 1070 |
<para>de supprimer des colonnes ;</para> |
|---|
| 1071 |
</listitem> |
|---|
| 1072 |
<listitem> |
|---|
| 1073 |
<para>d'ajouter des contraintes ;</para> |
|---|
| 1074 |
</listitem> |
|---|
| 1075 |
<listitem> |
|---|
| 1076 |
<para>de supprimer des contraintes ;</para> |
|---|
| 1077 |
</listitem> |
|---|
| 1078 |
<listitem> |
|---|
| 1079 |
<para>de modifier des valeurs par défaut ;</para> |
|---|
| 1080 |
</listitem> |
|---|
| 1081 |
<listitem> |
|---|
| 1082 |
<para>de modifier les types de données des colonnes ;</para> |
|---|
| 1083 |
< |
|---|