root/traduc/trunk/postgresql/ddl.xml

Revision 1092, 113.8 kB (checked in by sas, 5 months ago)

et de d...
--Cett, les suivantes ci-dessous, seront ignorées--

M postgresql/ddl.xml
M postgresql/docguide.xml

  • Property svn:keywords set to Date Author Revision
Line 
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&nbsp;: 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 &mdash; 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&nbsp;; 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&nbsp;:
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>&nbsp;;
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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;:
298 <programlisting>CREATE TABLE produits (
299     no_produit integer,
300     nom text,
301     prix numeric <emphasis>CHECK (prix &gt; 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&nbsp;:
326 <programlisting>CREATE TABLE produits (
327     no_produit integer,
328     nom text,
329     prix numeric <emphasis>CONSTRAINT prix_positif</emphasis> CHECK (prix &gt; 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 &gt; 0),
346     prix_promotion numeric CHECK (prix_promotion &gt; 0),
347     <emphasis>CHECK (prix &gt; 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&nbsp;:
371 <programlisting>CREATE TABLE produits (
372     no_produit integer,
373     nom text,
374     prix numeric,
375     CHECK (prix &gt; 0),
376     prix_promotion numeric,
377     CHECK (prix_promotion &gt; 0),
378     CHECK (prix &gt; prix_promotion)
379 );</programlisting>
380     ou même&nbsp;:
381 <programlisting>CREATE TABLE produits (
382     no_produit integer,
383     nom text,
384     prix numeric CHECK (prix &gt; 0),
385     prix_promotion numeric,
386     CHECK (prix_promotion &gt; 0 AND prix &gt; 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&nbsp;:
394 <programlisting>CREATE TABLE produits (
395     no_produit integer,
396     nom text,
397     prix numeric,
398     CHECK (prix &gt; 0),
399     prix_promotion numeric,
400     CHECK (prix_promotion &gt; 0),
401     <emphasis>CONSTRAINT promo_valide</emphasis> CHECK (prix &gt; 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&nbsp;:
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&nbsp;:
456 <programlisting>CREATE TABLE produits (
457     no_produit integer NOT NULL,
458     nom text NOT NULL,
459     prix numeric NOT NULL CHECK (prix &gt; 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&nbsp;; 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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;; la
597         syntaxe est semblable aux contraintes d'unicité&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;:
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&nbsp;? SQL
755         permet aussi de le gérer. Intuitivement, plusieurs options existent&nbsp;:
756         <itemizedlist spacing="compact">
757          <listitem><para>interdire d'effacer un produit référencé&nbsp;;</para></listitem>
758          <listitem><para>effacer aussi les commandes&nbsp;;</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&nbsp;:
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&nbsp;;</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&nbsp;:
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&nbsp;; 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)&nbsp;; 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&nbsp;; 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&nbsp;; 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&nbsp;; 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&nbsp;:
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&nbsp;; 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&nbsp;;
1000       </para>
1001     </listitem>
1002     <listitem>
1003       <para>
1004        l'unicité inter-tables des OID ne doit jamais être envisagée&nbsp;;
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&nbsp;;
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&nbsp;; 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 &mdash; 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&nbsp;; 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&nbsp;;</para>
1068     </listitem>
1069     <listitem>
1070      <para>de supprimer des colonnes&nbsp;;</para>
1071     </listitem>
1072     <listitem>
1073      <para>d'ajouter des contraintes&nbsp;;</para>
1074     </listitem>
1075     <listitem>
1076      <para>de supprimer des contraintes&nbsp;;</para>
1077     </listitem>
1078     <listitem>
1079      <para>de modifier des valeurs par défaut&nbsp;;</para>
1080     </listitem>
1081     <listitem>
1082      <para>de modifier les types de données des colonnes&nbsp;;</para>
1083     <