keys.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. <!--
  2. $Header: /usr/local/cvsroot/pgsql/doc/src/sgml/keys.sgml,v 1.3 1998/12/29 02:24:16 thomas Exp $
  3. Indices and Keys
  4. $Log: keys.sgml,v $
  5. Revision 1.3  1998/12/29 02:24:16  thomas
  6. Clean up to ensure tag completion as required by the newest versions
  7.  of Norm's Modular Style Sheets and jade/docbook.
  8. From Vince Vielhaber <vev@michvhf.com>.
  9. Revision 1.2  1998/08/17 16:18:13  thomas
  10. Small sentence cleanups. Add tags for acronyms and products.
  11. Revision 1.1  1998/08/15 06:52:03  thomas
  12. Nice exposition on indices and keys from Herouth Maoz which appeared
  13.  on the mailing lists a while ago. Maybe slightly changed to fit docs.
  14. Will go into the User's Guide.
  15. -->
  16. <chapter id="keys">
  17. <docinfo>
  18. <authorgroup>
  19. <author>
  20. <firstname>Herouth</firstname>
  21. <surname>Maoz</surname>
  22. </author>
  23. </authorgroup>
  24. <date>1998-03-02</date>
  25. </docinfo>
  26. <Title>Indices and Keys</Title>
  27. <Note>
  28. <Title>Author</Title>
  29. <Para>
  30. Written by 
  31. <ULink url="herouth@oumail.openu.ac.il">Herouth Maoz</ULink>
  32. </Para>
  33. </Note>
  34. <Note>
  35. <Title>Editor's Note</Title>
  36. <Para>
  37. This originally appeared on the mailing list
  38.  in response to the question:
  39.  "What is the difference between PRIMARY KEY and UNIQUE constraints?".
  40. </Para>
  41. </Note>
  42. <ProgramListing>
  43. Subject: Re: [QUESTIONS] PRIMARY KEY | UNIQUE
  44.         What's the difference between:
  45.               PRIMARY KEY(fields,...) and
  46.               UNIQUE (fields,...)
  47.        - Is this an alias?
  48.        - If PRIMARY KEY is already unique, then why
  49.          is there another kind of key named UNIQUE?
  50. </ProgramListing>
  51. <Para>
  52. A primary key is the field(s) used to identify a specific row. For example,
  53. Social Security numbers identifying a person.
  54. </Para>
  55. <Para>
  56. A simply UNIQUE combination of fields has nothing to do with identifying
  57. the row. It's simply an integrity constraint. For example, I have
  58. collections of links. Each collection is identified by a unique number,
  59. which is the primary key. This key is used in relations.
  60. </Para>
  61. <Para>
  62. However, my application requires that each collection will also have a
  63. unique name. Why? So that a human being who wants to modify a collection
  64. will be able to identify it. It's much harder to know, if you have two
  65. collections named "Life Science", the the one tagged 24433 is the one you
  66. need, and the one tagged 29882 is not.
  67. </Para>
  68. <Para>
  69. So, the user selects the collection by its name. We therefore make sure,
  70. withing the database, that names are unique. However, no other table in the
  71. database relates to the collections table by the collection Name. That
  72. would be very inefficient.
  73. </Para>
  74. <Para>
  75. Moreover, despite being unique, the collection name does not actually
  76. define the collection! For example, if somebody decided to change the name
  77. of the collection from "Life Science" to "Biology", it will still be the
  78. same collection, only with a different name. As long as the name is unique,
  79. that's OK.
  80. </Para>
  81. <Para>
  82. So:
  83. <itemizedlist>
  84. <ListItem>
  85. <Para>
  86. Primary key:
  87. <itemizedList Mark="bullet" Spacing="compact">
  88. <ListItem>
  89. <Para>
  90. Is used for identifying the row and relating to it.
  91. </Para>
  92. </ListItem>
  93. <ListItem>
  94. <Para>
  95. Is impossible (or hard) to update.
  96. </Para>
  97. </ListItem>
  98. <ListItem>
  99. <Para>
  100. Should not allow NULLs.
  101. </Para>
  102. </ListItem>
  103. </itemizedlist>
  104. </para>
  105. </listitem>
  106. <ListItem>
  107. <Para>
  108. Unique field(s):
  109. <itemizedlist Mark="bullet" Spacing="compact">
  110. <ListItem>
  111. <Para>
  112. Are used as an alternative access to the row.
  113. </Para>
  114. </ListItem>
  115. <ListItem>
  116. <Para>
  117. Are updateable, so long as they are kept unique.
  118. </Para>
  119. </ListItem>
  120. <ListItem>
  121. <Para>
  122. NULLs are acceptable.
  123. </Para>
  124. </ListItem>
  125. </itemizedlist>
  126. </para>
  127. </listitem>
  128. </itemizedlist>
  129. </para>
  130. <Para>
  131. As for why no non-unique keys are defined explicitly in standard <acronym>SQL</acronym> syntax?
  132. Well, you
  133. must understand that indices are implementation-dependent. <acronym>SQL</acronym> does not
  134. define the implementation, merely the relations between data in the
  135. database. <productname>Postgres</productname> does allow non-unique indices, but indices
  136. used to enforce <acronym>SQL</acronym> keys are always unique.
  137. </Para>
  138. <Para>
  139. Thus, you may query a table by any combination of its columns, despite the
  140. fact that you don't have an index on these columns. The indexes are merely
  141. an implementational aid which each <acronym>RDBMS</acronym> offers you, in order to cause
  142. commonly used queries to be done more efficiently. Some <acronym>RDBMS</acronym> may give you
  143. additional measures, such as keeping a key stored in main memory. They will
  144. have a special command, for example
  145. <programlisting>
  146. CREATE MEMSTORE ON &lt;table&gt; COLUMNS &lt;cols&gt;
  147. </programlisting>
  148. (this is not an existing command, just an example).
  149. </Para>
  150. <Para>
  151. In fact, when you create a primary key or a unique combination of fields,
  152. nowhere in the <acronym>SQL</acronym> specification does it say that an index is created, nor that
  153. the retrieval of data by the key is going to be more efficient than a
  154. sequential scan!
  155. </Para>
  156. <Para>
  157. So, if you want to use a combination of fields which is not unique as a
  158. secondary key, you really don't have to specify anything - just start
  159. retrieving by that combination! However, if you want to make the retrieval
  160. efficient, you'll have to resort to the means your <acronym>RDBMS</acronym> provider gives you
  161. - be it an index, my imaginary MEMSTORE command, or an intelligent <acronym>RDBMS</acronym>
  162. which creates indices without your knowledge based on the fact that you have
  163. sent it many queries based on a specific combination of keys... (It learns
  164. from experience).
  165. </Para>
  166. </chapter>