<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ref/create_table.sgml,v 1.5 2001/09/06 10:24:43 i-kaori Exp $
Postgres documentation
-->

<refentry id="SQL-CREATETABLE">
 <refmeta>
  <refentrytitle id="sql-createtable-title">
   CREATE TABLE
  </refentrytitle>
  <refmiscinfo>SQL<!-- Language Statements -->言語</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   CREATE TABLE
  </refname>
  <refpurpose>
   <!-- Creates a new table -->
   新しいテーブルを作成します。<indexterm><primary>CREATE TABLE</primary></indexterm><indexterm><primary>SQL</primary><secondary>CREATE TABLE</secondary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="さくせい">作成</secondary></indexterm>
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>2001-01-11</date>
  </refsynopsisdivinfo>
<synopsis>
CREATE [ TEMPORARY | TEMP ] TABLE <replaceable class="PARAMETER">table_name</replaceable> (
    { <replaceable class="PARAMETER">column_name</replaceable> <replaceable class="PARAMETER">type</replaceable> [ <replaceable class="PARAMETER">column_constraint</replaceable> [ ... ] ]
      | <replaceable>table_constraint</replaceable> }  [, ... ]
    ) [ INHERITS ( <replaceable>inherited_table</replaceable> [, ... ] ) ]

where <replaceable class="PARAMETER">column_constraint</replaceable> can be:
[ CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <replaceable class="PARAMETER">value</replaceable> | CHECK (<replaceable class="PARAMETER">condition</replaceable>) |
  REFERENCES <replaceable class="PARAMETER">table</replaceable> [ ( <replaceable class="PARAMETER">column</replaceable> ) ] [ MATCH FULL | MATCH PARTIAL ]
   [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]
   [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}

and <replaceable class="PARAMETER">table_constraint</replaceable> can be:
[ CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ]
{ UNIQUE ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) |
  PRIMARY KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) |
  CHECK ( <replaceable class="PARAMETER">condition</replaceable> ) |
  FOREIGN KEY ( <replaceable class="PARAMETER">column_name</replaceable> [, ... ] ) REFERENCES <replaceable class="PARAMETER">table</replaceable> [ ( <replaceable class="PARAMETER">column</replaceable> [, ... ] ) ]
   [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE <replaceable class="parameter">action</replaceable> ] [ ON UPDATE <replaceable class="parameter">action</replaceable> ]
   [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}
</synopsis>
  
  <refsect2 id="R2-SQL-CREATETABLE-1">
   <title>
    <!-- Inputs -->入力
   </title>


    <variablelist>
     <varlistentry>
      <term><!-- TEMPORARY or TEMP -->
             TEMPORARYまたはTEMP</term>
      <listitem>
       <para>
        <!-- 
	If specified, the table is created only for this session, and is
	automatically dropped on session exit.
	Existing permanent tables with the same name are not visible
	(in this session) while the temporary table exists.
	Any indexes created on a temporary table are automatically
	temporary as well. -->

        指定されると、このセッションに対してのみテーブルが作成され、セッション終了と同時に自動的に削除されます。同じ名前で存在している永続的なテーブルは一時的テーブルが存在している間は非可視です。一時テーブル上に作られるすべてのインデックスは自動的に一時的なものになります。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">table_name</replaceable></term>
      <listitem>
       <para>
	<!-- The name of the new table to be created. -->
        作成される新しいテーブルの名前です。 

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">column_name</replaceable></term>
      <listitem>
       <para>
	<!-- The name of a column to be created in the new table.
        -->

        新しいテーブルに作られる列の名前です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">type</replaceable></term>
      <listitem>
       <para>
        <!-- 
	The type of the column. This may include array specifiers.
	Refer to the <citetitle>PostgreSQL User's Guide</citetitle> for
	further information about data types and arrays. -->

        列の型です。配列の指定を含むこともあります。データ型と配列についてより詳しくは<citetitle>&user-guide;</citetitle>を参照してください。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">inherited_table</replaceable></term>
      <listitem>
       <para>
        <!-- 
	The optional INHERITS clause specifies a list of table
	names from which this table automatically inherits all fields.
	If any inherited field name appears more than once, 
	<productname>Postgres</productname>
	reports an error.
	<productname>Postgres</productname> automatically allows the created
	table to inherit functions on tables above it in the inheritance
	hierarchy. -->

        オプションのINHERITS句は、すべてのフィールドをそのテーブルから自動的に継承するテーブル名の集合を指定します。継承されたフィールド名が1つ以上あるときには、<productname>Postgres</productname>はエラーを出します。<productname>Postgres</productname>は、継承の階層の中でその上位にあるテーブル上の継承関数を作成されたテーブルが継承することを無条件で認めています。<indexterm><primary>INHERITS</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="けいしょう">継承</secondary></indexterm><indexterm><primary sortas="けいしょう">継承</primary></indexterm>

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">constraint_name</replaceable></term>
      <listitem>
       <para>
        <!-- 
        An optional name for a column or table constraint.  If not specified,
	the system generates a name. -->
        列またはテーブルの制約のオプションの名前です。指定されない場合はシステムが名前を作ります。
 
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">value</replaceable></term>
      <listitem>
       <para>
	<!-- A default value for a column.
	See the DEFAULT clause for more information. -->

        列のデフォルト値です。詳細についてはDEFAULT句を参照してください。 

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">condition</replaceable></term>
      <listitem>
       <para>
        <!-- 
	CHECK clauses specify integrity constraints or tests which new or
	updated rows must satisfy for an insert or update operation to
	succeed. Each constraint must be an expression producing
	a boolean result.
	A condition appearing within a column definition should reference
	that column's value only, while a condition appearing as a table
	constraint may reference multiple columns. -->

       CHECK句は完全性保証制約を指定する、もしくは挿入か更新の操作が成功するためにはどの新しいまたは更新された行を満たす必要があるかをテストします。それぞれの制約はブール値（論理値）の結果を作る式でなければいけません。列定義の中に現れる条件は、その列の値のみを参照するべきですが、テーブル制約として現れる条件は複数の列であっても構いません。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">table</replaceable></term>
      <listitem>
       <para>
        <!-- 
        The name of an existing table to be referenced by a foreign
	key constraint. -->

        外部キー制約に参照される既存テーブルの名前です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">column</replaceable></term>
      <listitem>
       <para>
        <!-- 
        The name of a column in an existing table to be referenced by a
	foreign key constraint.  If not specified, the primary key of
	the existing table is assumed. -->

        外部キー制約に参照される既存テーブル中の列の名前です。指定されない場合、既存テーブルの主キーが想定されます。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="PARAMETER">action</replaceable></term>
      <listitem>
       <para>
        <!-- 
        A keyword indicating the action to take when a foreign key
	constraint is violated. -->

        外部キー制約が違反されたときにとる動作を示すキーワードです。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>

  <refsect2 id="R2-SQL-CREATETABLE-2">
   <title>
    <!-- Outputs -->出力
   </title>

    <variablelist>
     <varlistentry>
      <term><computeroutput>
CREATE
       </computeroutput></term>
      <listitem>
       <para>
	<!-- Message returned if table is successfully created. -->
        テーブルが正常に作成されたときに返されるメッセージです。 

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><computeroutput>
ERROR
       </computeroutput></term>
      <listitem>
       <para>
	<!-- Message returned if table creation failed.
	This is usually accompanied by some descriptive text, such as: -->

        テーブルの作成に失敗したときに返されるメッセージです。通常以下のような説明文が付いてきます。
</para>

<screen>
	<computeroutput>
ERROR:  Relation '<replaceable class="parameter">table</replaceable>' already exists
	</computeroutput>
</screen>

<para>
	<!-- , which occurs at runtime if the table specified already exists
	in the database. -->

        これはデータベースにすでに指定したテーブルがある場合のもので、実行時に発生します。 

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
 </refsynopsisdiv>

 <refsect1 id="R1-SQL-CREATETABLE-1">
  <title>
   <!-- Description -->説明
  </title>

  <para>
   <!--   
   <command>CREATE TABLE</command> will enter a new, initially empty table
   into the current database. The table will be "owned" by the user issuing the
   command. -->

   <command>CREATE TABLE</command>は、指定したデータベースの中に新しく空のテーブルを挿入します。テーブルはこのコマンドを発行したユーザーによって「所有」されます。

  </para>

  <para>
   <!-- Each <replaceable class="PARAMETER">type</replaceable>
   may be a simple type, a complex type (set) or an array type.
   Each attribute may be specified to be non-null and
   each may have a default value, specified by the
   <xref linkend="R1-SQL-DEFAULTCLAUSE-1" endterm="R1-SQL-DEFAULTCLAUSE-1-TITLE">.
   -->

   それぞれの<replaceable class="PARAMETER">type</replaceable>は単純な型、複雑な型（集合）、配列型を指定することができます。それぞれの属性は非NULLに指定することができ、<xref linkend="R1-SQL-DEFAULTCLAUSE-1" endterm="R1-SQL-DEFAULTCLAUSE-1-TITLE">に指定されたデフォルト値を持つことができます。

  </para>

   <note>
    <para>
     <!-- Consistent array dimensions within an
     attribute are not enforced. This will likely change in a future
     release. -->

     属性内で配列次元を矛盾なくすることは強制されていません。将来のリリースではおそらく変わるでしょう。

    </para>
   </note>

  <para>
    <!-- 
   <command>CREATE TABLE</command> also automatically creates a data type
   that represents the tuple type (structure type) corresponding to one
   row of the table.  Therefore, tables can't have the same name as any
   existing datatype. -->

   <command>CREATE TABLE</command>はさらに、自動的にテーブルの1行に対応するタプル型（構造の型）を表すデータ型を作成します。したがって、テーブルはどの既存のデータ型とも同じ名前をもつことはできません。
   
  </para>

  <para>
   <!-- The optional INHERITS
   clause specifies a collection of table names from which this table
   automatically inherits all fields.  If any inherited field name
   appears more than once, Postgres reports an error.  Postgres automatically
   allows the created table to inherit functions on tables above it in
   the inheritance hierarchy.  Inheritance of functions is done according
   to the conventions of the Common Lisp Object System (CLOS). -->

   オプションのINHERITS句は、このテーブルが自動的にすべてのフィールドを継承するテーブル名の集合を指定します。もし継承されたフィールド名が一度以上現れる場合、Postgresはエラーを表示します。Postgresは作成されたテーブルが継承階層の1つ上のテーブルの関数を継承することを自動的に許可します。関数の継承はCommon Lisp Object System（CLOS）の規約に基づいて行われます。

  </para>

  <para>
   <!-- 
   A table can have no more than 1600 columns (in practice, the
   effective limit is lower because of tuple-length constraints).
   A table cannot have the same name as a system catalog table.
   -->

   テーブルは1,600列以上持つことができません（実際では、タプル長制約のために効果的な制限はさらに低くなります）。テーブルはシステムカタログテーブルと同じ名前を持つことはできません。<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="れつすうのせいげん">列数の制限</secondary></indexterm>
  </para>
 </refsect1>

 <refsect1 id="R1-SQL-DEFAULTCLAUSE-1">
  <title id="R1-SQL-DEFAULTCLAUSE-1-TITLE">
   <!-- DEFAULT Clause -->
   DEFAULT句
  </title>
<indexterm><primary>DEFAULT</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="DEFAULTく">DEFAULT句</secondary></indexterm>

<synopsis>
DEFAULT <replaceable class="PARAMETER">value</replaceable>
</synopsis>

  <para>
   <!-- 
   The DEFAULT clause assigns a default data value for the column whose
   column definition it appears within.  The value is any variable-free
   expression (note that sub-selects and cross-references to other
   columns in the current table are not supported).
   The data type of a default value must match the column definition's
   data type. -->

   DEFAULT句は、その列定義が現れる列のデフォルトデータ値を割り当てます。その値は任意の無変数式です（現在のテーブル内の他の列への副問い合わせと交差参照はサポートされていないので注意してください）。デフォルト値のデータ型はカラム定義のデータ型に一致しなければなりません。
  </para>

  <para>
   <!-- 
   The DEFAULT expression will be used in any INSERT operation that does
   not specify a value for the column.  If there is no DEFAULT clause,
   then the default is NULL. -->

   DEFAULT式は列に値を指定しない任意のINSERT操作で使われます。もしDEFAULT句がない場合、デフォルトはNULLです。

  </para>

  <refsect2 id="R2-SQL-DEFAULTCLAUSE-2">
   <title>
    <!-- Usage -->使用方法
   </title>

<programlisting>
CREATE TABLE distributors (
    name     VARCHAR(40) DEFAULT 'luso films',
    did      INTEGER     DEFAULT NEXTVAL('distributors_serial'),
    modtime  TIMESTAMP   DEFAULT now()
);
</programlisting>

<para>
    <!-- 
    The above assigns a literal constant default value for the column
    <literal>name</literal>, and arranges for the default value of column
    <literal>did</literal> to be generated by selecting the next value of a
    sequence object.  The default value of <literal>modtime</literal> will
    be the time at which the row is inserted. -->

    上記は列<literal>name</literal>にリテラル定数デフォルト値を割り当て、列<literal>did</literal>のデフォルト値がシーケンスオブジェクトの次の値を選択することで作られるように設定します。<literal>modtime</literal>のデフォルト値はその行が挿入された時間になります。

   </para>

    <!-- It is worth remarking that -->
<programlisting>
    modtime  TIMESTAMP DEFAULT 'now'
</programlisting>

<para>
    <!-- 
    would produce a result that is probably not the intended one: the
    string <literal>'now'</literal> will be coerced to a timestamp value
    immediately, and so the default value of <literal>modtime</literal> will
    always be the time of table creation.  This difficulty is avoided by
    specifying the default value as a function call. -->

    上記がおそらく意図したものとは異なる結果をもたらすことに注意してください。文字列<literal>'now'</literal>は即座にtimestamp値に型強制され、したがって<literal>modtime</literal>のデフォルト値は常にテーブル作成の時間になります。この問題はデフォルト値を関数呼び出しとして指定することで回避できます。

   </para>
  </refsect2>
 </refsect1>

 <refsect1 id="R1-SQL-COLUMNCONSTRAINT-1">
  <title id="R1-SQL-COLUMNCONSTRAINT-1-TITLE">
   <!-- Column Constraints -->列制約
  </title>
<indexterm><primary sortas="れつせいやく">列制約</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="れつせいやく">列制約</secondary></indexterm>

<synopsis>
[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] {
    NULL | NOT NULL | UNIQUE | PRIMARY KEY | CHECK <replaceable
     class="parameter">condition</replaceable> |
    REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ]
     [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
     [ ON DELETE <replaceable class="parameter">action</replaceable> ] 
     [ ON UPDATE <replaceable class="parameter">action</replaceable> ]
     [ [ NOT ] DEFERRABLE ] 
     [ INITIALLY <replaceable class="parameter">checktime</replaceable> ] }
</synopsis>

  <refsect2 id="R2-SQL-COLUMNCONSTRAINT-1">
   <title>
    <!-- Inputs -->入力
   </title>

    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">constraint_name</replaceable></term>
      <listitem>
       <para>
	<!-- An arbitrary name given to a constraint clause. -->
        制約句に与えられる任意の名前です。
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>NULL</term>
      <listitem>
       <para>
	<!-- The column is allowed to contain NULL values. This is the default.
        -->
        列にはNULL値があっても構いません。これはデフォルトです。 
 
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>NOT NULL</term>
      <listitem>
       <para>
	<!-- The column is not allowed to contain NULL values.
	This is equivalent to the column constraint
	CHECK (<replaceable class="PARAMETER">column</replaceable> NOT NULL).
        -->

        列にNULL値があってはいけません。これは列制約CHECK ((<replaceable class="PARAMETER">column</replaceable> NOT NULL)と等価です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>UNIQUE</term>
      <listitem>
       <para>
	<!-- 
        The column must have unique values. In 
        <productname>Postgres</productname>
	this is enforced by automatic creation of a unique index on the column.
        -->

        列に一意の値がなければなりません。<productname>Postgres</productname>では、列上にUNIQUEインデックスを自動的に作成することで実施されます。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>PRIMARY KEY</term>
      <listitem>
       <para>
        <!-- 
	This column is a primary key, which implies that other tables may rely
	on this column as a unique identifier for rows.  Both UNIQUE and
	NOT NULL are implied by PRIMARY KEY.  See PRIMARY KEY for more
	information. -->

        この列は主キーで、他のテーブルがこの列を行に対する一意な識別子として参照することができるようになります。UNIQUEとNOT NULLは両方ともPRIMARY KEYで意味付けられます。さらに詳しい情報はPRIMARY KEYを参照してください。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>
<replaceable class="parameter">condition</replaceable>
      </term>
      <listitem>
       <para>
	<!-- An arbitrary boolean-valued constraint condition. -->
        任意のブール（論理）値を持つ制約条件です。
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>

  <refsect2 id="R2-SQL-COLUMNCONSTRAINT-2">
   <title>
    <!-- Description -->説明
   </title>

   <para>
    <!-- 
    The optional constraint clauses specify constraints or tests which
    new or updated rows must satisfy for an insert or update
    operation to succeed. -->

    オプションの制約句は、制約を指定するか、あるいはどの新しい又は更新された行が挿入か更新操作を成功させるのに必要かをテストします。

   </para>

   <para>
    <!--  
    A constraint is a named rule: an SQL object which helps define
    valid sets of values by putting limits on the results of INSERT,
    UPDATE or DELETE operations performed on a table.  -->

    制約とは、名前の付いているルールで、テーブル上で実行されたINSERT、UPDATE、DELETEなどの操作の結果に制限を加えることによって有効な値の一群の定義を手助けするSQLオブジェクトです。 
   </para>

   <para>
    <!-- There are two ways to define integrity constraints:
    table constraints, covered later, and column constraints, covered here.
    -->

    完全性保証制約条件を定義する方法は、後で述べるテーブル制約条件と、ここで述べる列制約条件の2つがあります。<indexterm><primary sortas="かんぜんせいほしょうせいやくじょうけん">完全性保証制約条件</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="かんぜんせいほしょうせいやくじょうけん">完全性保証制約条件</secondary></indexterm>
 
   </para>

   <para>
    <!-- 
    A column constraint is an integrity constraint defined as part of a
    column definition, and logically becomes a table constraint as soon
    as it is created. The column constraints available are: -->

    列制約条件は列定義の一部として定義される、データの完全性を保証する制約条件で、理論上、作成された時点でテーブル制約条件となります。列制約条件として有効なものは以下のものです。
</para>

    <simplelist columns="1">
     <member>PRIMARY KEY</member>
     <member>REFERENCES</member>
     <member>UNIQUE</member>
     <member>CHECK</member>
     <member>NOT NULL</member>
    </simplelist>
  </refsect2>
   
  <refsect2 id="R2-SQL-NOTNULL-1">
   <title>
    NOT NULL <!-- Constraint -->制約
   </title>
<synopsis>
[ CONSTRAINT <replaceable class="parameter">name</replaceable> ] NOT NULL 
</synopsis>
   <para>
    <!-- 
    The NOT NULL constraint specifies a rule that a column may
    contain only non-null values. 
    This is a column constraint only, and not allowed
    as a table constraint. -->

    NOT NULL制約条件は、列が非NULL値のみというルールを指定します。これは、列制約条件のみに対するものであって、テーブル制約条件としては認められていません。<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="NOT NULLせいやくじょうけん">NOT NULL制約条件</secondary></indexterm>
 
   </para>

   <refsect3 id="R3-SQL-NOTNULL-1">
    <title>
     <!-- Outputs -->出力
    </title>
     <variablelist>
      <varlistentry>
       <term><replaceable>status</replaceable></term>
       <listitem>
	<variablelist>
	  <varlistentry>
	   <term><computeroutput>
ERROR:  ExecAppend: Fail to add null value in not null attribute "<replaceable class="parameter">column</replaceable>".
	    </computeroutput></term>
	   <listitem>
	    <para>
             <!-- 
	     This error occurs at runtime if one tries to insert a null value
	     into a column which has a NOT NULL constraint. -->

             実行時、NOT NULL制約事項のある列にNULL値を挿入しようとしたときに起こるエラーです。

	    </para>
	   </listitem>
	  </varlistentry>
	</variablelist>
       </listitem>
      </varlistentry>
     </variablelist> 
   </refsect3>

   <refsect3 id="R3-SQL-NOTNULL-2">
    <title>
     <!-- Description -->説明
    </title>
    <para>
    </para>
   </refsect3>

   <refsect3 id="R3-SQL-NOTNULL-3">
    <title>
     <!-- Usage -->使用方法
    </title>

    <para>
     <!-- Define two NOT NULL column constraints on the table
     <classname>distributors</classname>,
     one of which is explicitly given a name: -->

     1つが明示的に名前を与えられているテーブル<classname>distributors</classname>上に2つのNOT NULL列制約条件を設定するには、以下のようにします。
</para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3) CONSTRAINT no_null NOT NULL,
    name     VARCHAR(40) NOT NULL
);
</programlisting>
   </refsect3>
  </refsect2>

  <refsect2 id="R2-SQL-UNIQUECLAUSE-1">
   <title>
    UNIQUE <!-- Constraint -->制約
   </title>
<synopsis>
[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] UNIQUE
</synopsis>

   <refsect3>
    <title><!-- Inputs -->入力</title>

     <variablelist>
      <varlistentry>
       <term><replaceable class="parameter">constraint_name</replaceable></term>
       <listitem>
	<para>
	<!--  An arbitrary name given to a constraint clause. -->
        制約句に与えられる任意の名前です。

	</para>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>
   
   <refsect3>
    <title><!-- Outputs -->出力</title>
     <variablelist>
      <varlistentry>
       <term><replaceable>status</replaceable></term>
       <listitem>
	 <variablelist>
	  <varlistentry>
	   <term><computeroutput>
ERROR: Cannot insert a duplicate key into a unique index.
	    </computeroutput></term>
	   <listitem>
	    <para>
	     <!-- This error occurs at runtime if one tries to insert a
	     duplicate value into a column. -->

             このエラーは、列に複製の値を挿入しようとした場合に、実行時に起こります。

	    </para>
	   </listitem>
	  </varlistentry>
	 </variablelist>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>

   <refsect3>
    <title>
     <!-- Description -->説明
    </title>

    <para>
     <!-- 
     The UNIQUE constraint specifies a rule that a group of one or
     more distinct columns of a table may contain only unique values. -->

     UNIQUE制約条件は、テーブルの1つ以上の独立したそれぞれの列のグループが一意の値しか持つことができないというルールを指定します。

    </para>
    <para>
     <!-- 
     The column definitions of the specified columns do not have to
     include a NOT NULL constraint to be included in a UNIQUE
     constraint. Having more than one null value in a column without a
     NOT NULL constraint, does not violate a UNIQUE constraint. (This
     deviates from the <acronym>SQL92</acronym> definition, but is a
     more sensible convention. See the section on compatibility for more
     details.) -->

     指定された列の列定義は、UNIQUE制約条件に含まれるNOT NULL制約条件を持ってはなりません。NOT NULL制約条件のない列に1つ以上のNULL値があってもUNIQUE制約条件に違反しません（このことは<acronym>SQL92</acronym>定義から逸脱しますが、より意味のある取り決めです。詳細は<!--<xref linkend="R1-SQL-CREATETABLE-3">-->互換性に関する解説を参照してください）。

    </para>
    <para>
     <!-- 
     Each UNIQUE column constraint must name a column that is
     different from the set of columns named by any other UNIQUE or
     PRIMARY KEY constraint defined for the table. -->

     それぞれのUNIQUE列制約条件は、そのテーブルに対して指名された他のいかなるUNIQUEまたはPRIMARY KEY制約条件によって指名された列の集合とは異なる列名を指定しなければいけません。

    </para>
    <note>
     <para>
      <!-- 
      <productname>Postgres</productname> automatically creates a unique
      index for each UNIQUE constraint, to assure
      data integrity. See CREATE INDEX for more information. -->

      データの完全性を保証するため、<productname>Postgres</productname>はそれぞれのUNIQUE制約条件に対して自動的に一意のインデックスを作成します。より詳しくは、CREATE INDEXを参照してください。

     </para>
    </note>
   </refsect3>

   <refsect3 id="R3-SQL-UNIQUECLAUSE-3">
    <title>
     <!-- Usage -->使用方法
    </title>

    <para>
     <!--  
     Defines a UNIQUE constraint for the <literal>name</literal> column:
     -->
     <literal>name</literal>列にUNIQUE制約を定義するには、以下のようにします。
 </para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40) UNIQUE
);
</programlisting>

<para>
     <!--  
     which is equivalent to the following specified as a table constraint:
     -->

     これは下記でテーブル制約として指定されるものと同等です。
 </para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
</programlisting>
   </refsect3>
  </refsect2>

  <refsect2 id="R2-SQL-CHECK-1">
   <title>
    <!-- The CHECK Constraint -->CHECK制約
   </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="CHECKせいやく">CHECK制約</secondary></indexterm>
<synopsis>
[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] CHECK ( <replaceable>condition</replaceable> )
</synopsis>
   <refsect3 id="R3-SQL-CHECK-1">
    <title><!-- Inputs -->入力</title>

     <variablelist>
      <varlistentry>
       <term><replaceable class="parameter">constraint_name</replaceable></term>
       <listitem>
	<para>
	<!-- An arbitrary name given to a constraint clause. -->
         制約条件句に与えられる任意の名前です。 

	</para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term><replaceable>condition</replaceable></term>
       <listitem>
	<para>
         <!-- 
	 Any valid conditional expression evaluating to a boolean result.
         -->

         ブール（論理）値の結果を評価する有効な任意の条件式です。 

	</para>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>

   <refsect3 id="R3-SQL-CHECK-2">
    <title>
     <!-- Outputs -->出力
    </title>

     <variablelist>
      <varlistentry>
       <term><replaceable>status</replaceable></term>
       <listitem>

	<variablelist>
	  <varlistentry>
	   <term><computeroutput>
ERROR:  ExecAppend: rejected due to CHECK constraint "<replaceable class="parameter">constraint_name</replaceable>".
	    </computeroutput></term>
	   <listitem>
	    <para>
             <!-- 
	     This error occurs at runtime if one tries to insert an illegal
	     value into a column subject to a CHECK constraint. -->

             実行時に違法の値が、CHECK制約条件となる列に挿入されようとしたときに出力されるエラーです。

	    </para>
	   </listitem>
	  </varlistentry>
	 </variablelist>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>

   <refsect3>
    <title><!-- Description -->説明</title>
    <para>
     <!-- 
     The CHECK constraint specifies a generic restriction on allowed values
     within a column. The CHECK constraint is also allowed as a table
     constraint. -->

     CHECK制約は、列内で有効な値に対しての一般的な制約を指定します。CHECK制約条件はテーブル制約条件としても有効です。

    </para>
    <para>
     <!-- 
     CHECK specifies a general boolean expression involving one or more
     columns of a table.  A new row will be rejected if the boolean
     expression evaluates to FALSE when applied to the row's values.
     -->

     CHECKはテーブルの1つ以上の列を含む一般的なブール式を指定します。そのブール式が行の値に適用されたときに偽と評価されると、新しい行は拒否されます。

    </para>
     <para>
     <!-- 
     Currently, CHECK expressions cannot contain sub-selects nor refer
     to variables other than fields of the current row. -->

     現時点では、CHECK式は副問い合わせを含んだり、現在の行のフィールド以外の変数を参照することはできません。

    </para>
    <para>
     <!-- 
     The SQL92 standard says that CHECK column constraints may only refer
     to the column they apply to; only CHECK table constraints may refer
     to multiple columns.
     <productname>Postgres</productname> does not enforce this restriction.
     It treats column and table CHECK constraints alike. -->

     SQL92の標準はCHECK列制約は適用する列のみを参照できるとなっています。CHECKテーブル制約のみが複数の列を参照することができます。<productname>Postgres</productname>はこの制約を強制しません。列とテーブルCHECK制約は同等に扱われます。

    </para>
   </refsect3>
  </refsect2>
  
  <refsect2 id="R2-SQL-PRIMARYKEY-1">
   <title>
    PRIMARY KEY <!-- Constraint -->制約
   </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="PRIMARY KEYせいやく">PRIMARY KEY制約</secondary></indexterm>
<synopsis>
[ CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ] PRIMARY KEY 
</synopsis>

   <refsect3>
    <title><!-- Inputs -->入力</title>
     <variablelist>
      <varlistentry>
       <term><replaceable class="PARAMETER">constraint_name</replaceable></term>
       <listitem>
	<para>
	 <!-- An arbitrary name given to a constraint clause. -->
         制約句に与えられる任意の名前です。
	</para>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>

   <refsect3>
    <title><!-- Outputs -->出力</title>
    <variablelist>
     <varlistentry>
      <term><computeroutput>
ERROR: Cannot insert a duplicate key into a unique index.
       </computeroutput></term>
      <listitem>
       <para>
        <!-- 
	This occurs at runtime if one tries to insert a duplicate value into
	a column subject to a PRIMARY KEY constraint. -->

        実行時に重複した値が、PRIMARY KEY制約条件となる列に挿入されようとしたときに出力されるエラーです。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
   </refsect3>

   <refsect3>
    <title><!-- Description -->説明</title>
    <para>
     <!-- 
     The PRIMARY KEY column constraint specifies that a column of a
     table may contain only unique (non-duplicate), non-NULL values. The
     definition of the specified column does not have to include an
     explicit NOT NULL constraint to be included in a PRIMARY KEY
     constraint. -->

     PRIMARY KEY列制約条件は、テーブルの列には一意の（重複しない）、NULLでない値のみであることを指定します。指定された列の定義では、PRIMARY KEY制約条件に含まれる暗黙的なNOT NULL制約条件を持つ必要はありません。
 
    </para>
    <para>
     <!-- 
     Only one PRIMARY KEY can be specified for a table, whether as a
     column constraint or a table constraint. -->

     テーブルに対し1つのPRIMARY KEYのみが、列制約かテーブル制約かを指定できます。 

    </para>
   </refsect3>

   <refsect3 id="R3-SQL-PRIMARYKEY-3">
    <title>
     <!-- Notes -->注釈
    </title>
    <para>
     <!-- 
     <productname>Postgres</productname> automatically creates
     a unique index to assure
     data integrity (see CREATE INDEX statement). -->

     データの完全性を保証するため、<productname>Postgres</productname>は自動的に一意のインデックスを作成します（CREATE INDEXを参照してください）。
 
    </para>
    <para>
     <!-- 
     The PRIMARY KEY constraint should name a set of columns that is
     different from other sets of columns named by any UNIQUE constraint
     defined for the same table, since it will result in duplication
     of equivalent indexes and unproductive additional runtime overhead.
     However, <productname>Postgres</productname> does not specifically
     disallow this. -->

     PRIMARY KEYでは、同じテーブルに定義されたUNIQUE制約条件によって指定された列の他の一群と異なった列の一群を指定しなければいけません。というのは、同じインデックスを複製したり、余分な、役に立たない実行時における作業のオーバーヘッドを排除するためです。とはいえ、<productname>Postgres</productname>は特別にこのことを認めていないわけではありません。

    </para>
   </refsect3>
  </refsect2>

  <refsect2 id="R2-SQL-REFERENCES-1">
   <refsect2info>
    <date>2000-02-04</date>
   </refsect2info>
   <title>
    REFERENCES<!-- Constraint -->制約
   </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="REFERENCESせいやく">REFERENCES制約</secondary></indexterm>
<synopsis>
[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> ) ] 
    [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
    [ ON DELETE <replaceable class="parameter">action</replaceable> ] 
    [ ON UPDATE <replaceable class="parameter">action</replaceable> ]
    [ [ NOT ] DEFERRABLE ] 
    [ INITIALLY <replaceable class="parameter">checktime</replaceable> ]
</synopsis>
   <para>
    <!--  
    The REFERENCES constraint specifies a rule that a column
    value is checked against the values of another column.
    REFERENCES can also be specified as part of
    a FOREIGN KEY table constraint. -->

    REFERENCES制約は、列の値が別の列の値とチェックされるルールを指定します。REFERENCESはさらにFOREIGN KEYテーブル制約の一部として指定することもできます。
   </para>

   <refsect3 id="R3-SQL-REFERENCES-1">
    <title><!-- Inputs -->入力</title>

     <variablelist>
      <varlistentry>
       <term><replaceable class="PARAMETER">constraint_name</replaceable></term>
       <listitem>
	<para>
	<!-- An arbitrary name given to a constraint clause. -->
         制約句に与えられる任意の名前です。

	</para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><replaceable class="parameter">reftable</replaceable></term>
       <listitem>
        <para>
         <!-- The table that contains the data to check against. -->
         チェックをするデータを持つテーブルです。

        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><replaceable class="parameter">refcolumn</replaceable></term>
       <listitem>
        <para>
         <!-- 
         The column in <replaceable class="parameter">reftable</replaceable>
         to check the data against.  If this is not specified, the 
         PRIMARY KEY of the
         <replaceable class="parameter">reftable</replaceable> is used.
         -->

         データをチェックする<replaceable class="parameter">reftable</replaceable>の列です。これが指定されない場合は、<replaceable class="parameter">reftable</replaceable>のPRIMARY KEYが使われます。

        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>MATCH <replaceable class="parameter">matchtype</replaceable></term>
       <listitem>
        <para>
         <!-- 
         There are three match types: MATCH FULL, MATCH PARTIAL, and a
         default match type if none is specified. MATCH FULL will not
         allow one column of a multi-column foreign key to be NULL
         unless all foreign key columns are NULL. The default MATCH type
         allows some foreign key columns to be NULL while other parts
         of the foreign key are not NULL. MATCH PARTIAL is currently not
	 supported. -->

         MATCH型には3つあります。MATCH FULL、MATCH PARTIAL、そして指定がない場合はデフォルトのMATCH型です。MATCH FULLは、すべての外部キー列がNULLでない限り複数列の外部キーの一列がNULLになることを認めません。デフォルトのMATCH型は、外部キーの他の部分がNULLではない間、いくつかの外部キー列がNULLになることを認めます。MATCH PARTIALは現在のところサポートされていません。<indexterm><primary sortas="MATCHがた">MATCH型</primary></indexterm>

        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>ON DELETE <replaceable class="parameter">action</replaceable></term>
       <listitem>
        <para>
         <!-- 
	 The action to do when a referenced row in the referenced 
         table is being deleted.  There are the following actions. -->

         参照されるテーブルの参照される行が削除されるときに行う動作です。下記のものがあります。
</para>

         <variablelist>
          <varlistentry>
           <term>NO ACTION</term>
           <listitem>
            <para>
             <!-- 
             Produce error if foreign key violated.  This is the default.
             -->

             外部キーが違反されたときにエラーにします。これはデフォルトです。

            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>RESTRICT</term>
           <listitem>
            <para>
             <!-- Same as NO ACTION. -->
              NO ACTIONと同じです。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>CASCADE</term>
           <listitem>
            <para>
             <!-- Delete any rows referencing the deleted row. -->
             削除された行を参照する任意の行を削除します。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET NULL</term>
           <listitem>
            <para>
             <!-- Set the referencing column values to NULL. -->
             列の参照値をNULLに設定します。

            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET DEFAULT</term>
           <listitem>
            <para>
             <!-- 
             Set the referencing column values to their default value.
             -->

             列の参照値をデフォルト値に設定します。

            </para>
           </listitem>
          </varlistentry>
         </variablelist>
       </listitem>
      </varlistentry>      
      <varlistentry>
       <term>ON UPDATE <replaceable class="parameter">action</replaceable></term>
       <listitem>
        <para>
         <!-- 
	 The action to do when a referenced column in the referenced
	 table is being updated to a new value. If the row is updated,
	 but the referenced column is not changed, no action is done.
	 There are the following actions. -->

         参照されるテーブルの参照される列が新しい値に更新されるときに行う動作です。もし行が更新され、しかし参照される列が変わっていない場合、何も動作は起きません。動作には以下のものがあります。
</para>

         <variablelist>
          <varlistentry>
           <term>NO ACTION</term>
           <listitem>
            <para>
             <!-- 
             Produce error if foreign key violated.  This is the default.
             -->
             外部キーが違反された場合エラーにします。これがデフォルトです。 
 
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>RESTRICT</term>
           <listitem>
            <para>
             <!-- Same as NO ACTION. -->
              NO ACTIONと同じです。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>CASCADE</term>
           <listitem>
            <para>
             <!-- 
             Update the value of the referencing column to the new value of the
             referenced column. -->

             参照する列の値をその列の新しい値に更新します。

            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET NULL</term>
           <listitem>
            <para>
             <!-- Set the referencing column values to NULL. -->
             参照する列の値をNULLに設定します。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET DEFAULT</term>
           <listitem>
            <para>
            <!-- 
             Set the referencing column values to their default value.
             -->
             参照する列の値をデフォルト値に設定します。
            </para>
           </listitem>
          </varlistentry>
         </variablelist>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term> [ NOT ] DEFERRABLE </term>
       <listitem>
        <para>
         <!-- 
         This controls whether the constraint can be deferred to the end
         of the transaction. If DEFERRABLE, SET CONSTRAINTS ALL DEFERRED
         will cause the foreign key to be checked only at the end of the
         transaction. NOT DEFERRABLE is the default. -->

         これは、制約がトランザクションの終わりまで延期できるかどうかを管理します。DEFERRABLEの場合、SET CONSTRAINTS ALL DEFERREDは外部キーがトランザクションの終わりでのみチェックするようにします。デフォルトはNOT DEFERRABLEです。<indexterm><primary>DEFERRABLE</primary></indexterm>

        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>INITIALLY <replaceable class="parameter">checktime</replaceable></term>
       <listitem>
        <para>
         <!-- 
         <replaceable class="parameter">checktime</replaceable> 
         has two possible values 
         which specify the default time to check the constraint. -->
 
         <replaceable class="parameter">checktime</replaceable>は、制約をチェックするデフォルトの時間を指定する2つの可能な値を持っています。
</para>

         <variablelist>
          <varlistentry>
           <term>DEFERRED</term>
	   <listitem>
	    <para>
	     <!-- Check constraint only at the end of the transaction. -->
             トランザクションの終わりでのみ制約をチェックします。

	    </para>
	   </listitem>
          </varlistentry>
          <varlistentry>
           <term>IMMEDIATE</term>
	   <listitem>
	    <para>
             <!-- 
	     Check constraint after each statement. This is the default.
             -->
             それぞれの文のあとで制約をチェックします。これがデフォルトです。

	    </para>
	   </listitem>
	  </varlistentry>
         </variablelist>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>
   

   <refsect3 id="R3-SQL-REFERENCES-2">
    <refsect3info>
     <date>2000-02-04</date>
    </refsect3info>
    <title>
     <!-- Outputs -->出力
    </title>

     <variablelist>
      <varlistentry>
       <term><replaceable>status</replaceable></term>
       <listitem>
	 <variablelist>
	  <varlistentry>
	   <term><computeroutput>
ERROR:  <replaceable class="parameter">name</replaceable> referential integrity violation - key referenced from 
<replaceable class="parameter">table</replaceable> not found in <replaceable class="parameter">reftable</replaceable>
	    </computeroutput></term>
	   <listitem>
	    <para>
             <!-- 
             This error occurs at runtime if one tries to insert a value
             into a column which does not have a matching column in the
             referenced table. -->

             このエラーは、参照されるテーブルに照合する列を持たない列に値を挿入しようとした場合に、実行時に起こります。
	    </para>
	   </listitem>
	  </varlistentry>
	 </variablelist>
       </listitem>
      </varlistentry>
     </variablelist> 
   </refsect3>

   <refsect3 id="R3-SQL-REFERENCES-3">
    <title><!-- Description -->説明</title>
    <para>
     <!-- The REFERENCES column constraint specifies that a
     column of a table must only contain values which match against
     values in a referenced column of a referenced table. -->

     REFERENCES列制約は、テーブルの列が、参照されるテーブルの参照される列にある値と照合する値のみを持つことができると指定します。

    </para>
    <para>
     <!--
     A value added to this column is matched against the values of the
     referenced table and referenced column using the given match type.
     In addition, when the referenced column data is changed, actions
     are run upon this column's matching data. -->

     この列に追加される値は、与えられたMATCH型を使って、参照されるテーブルと参照される列の値に照合されます。さらに、参照される列データが変更されると、動作はこの列の照合するデータ上で実行されます。

    </para>
   </refsect3>

   <refsect3 id="R3-SQL-REFERENCES-4">
    <refsect3info>
     <date>1998-09-11</date>
    </refsect3info>
    <title>
     <!-- Notes -->注釈
    </title>
    <para>
     <!-- 
     Currently <productname>Postgres</productname> only supports MATCH
     FULL and a default match type. In addition, the referenced
     columns are supposed to be the columns of a UNIQUE constraint in
     the referenced table, however <productname>Postgres</productname>
     does not enforce this. -->

     現在のところ<productname>Postgres</productname>はMATCH FULLとデフォルトMATCH型のみをサポートしています。さらに、参照される列は参照されるテーブルのUNIQUE制約の列であるはずですが、<productname>Postgres</productname>はそれを強制しません。

    </para>
   </refsect3>
  </refsect2>
 </refsect1>
 
 <refsect1 id="R1-SQL-TABLECONSTRAINT-1">
  <title>
   <!-- Table Constraints -->テーブル制約
  </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="てーぶるせいやく">テーブル制約</secondary></indexterm>

<synopsis>
[ CONSTRAINT name ] { PRIMARY KEY |  UNIQUE } ( <replaceable class="parameter">column</replaceable> [, ... ] )
[ CONSTRAINT name ] CHECK ( <replaceable>constraint</replaceable> )
[ CONSTRAINT name ] FOREIGN KEY ( <replaceable class="parameter">column</replaceable> [, ... ] ) 
                     REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ]
                      [ MATCH <replaceable class="parameter">matchtype</replaceable> ] 
                      [ ON DELETE <replaceable class="parameter">action</replaceable> ] 
                      [ ON UPDATE <replaceable class="parameter">action</replaceable> ]
                      [ [ NOT ] DEFERRABLE ] 
                      [ INITIALLY <replaceable class="parameter">checktime</replaceable> ]
</synopsis>

  <refsect2 id="R2-SQL-TABLECONSTRAINT-1">
   <title>
    <!-- Inputs -->入力
   </title>


    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">constraint_name</replaceable></term>
      <listitem>
       <para>
	<!-- An arbitrary name given to a constraint clause. -->
        制約句に与えられる任意の名前です。 

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">column</replaceable> [, ... ]</term>
      <listitem>
       <para>
        <!-- 
	The column name(s) for which to define a unique index
	and, for PRIMARY KEY, a NOT NULL constraint. -->

        一意のインデックスを定義する列名で、PRIMARY KEYにはNOT NULL制約です。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term>CHECK ( <replaceable class="parameter">constraint</replaceable> )</term>
      <listitem>
       <para>
        <!-- 
	A boolean expression to be evaluated as the constraint. -->
        制約として評価されるブール（論理）式です。
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
    
  <refsect2 id="R2-SQL-TABLECONSTRAINT-2">
   <title>
    <!-- Outputs -->出力
   </title>
   
   <para>
    <!-- 
    The possible outputs for the table constraint clause are the same
    as for the corresponding portions of the column constraint clause.
    -->

    テーブル制約句への可能な出力は、列制約句の場合と同じです。

   </para>
  </refsect2>
  
  <refsect2 id="R2-SQL-TABLECONSTRAINT-3">
   <title>
    <!-- Description -->説明
   </title>
   
   <para>
    <!-- 
    A table constraint is an integrity constraint defined on one or
    more columns of a table. The four variations of "Table
    Constraint" are: -->

    テーブル制約はテーブルの1つ以上の列に定義される完全性保証制約条件です。「テーブル制約」の4つのバリエーションは以下のとおりです。
</para>

    <simplelist columns="1">
     <member>UNIQUE</member>
     <member>CHECK</member>
     <member>PRIMARY KEY</member>
     <member>FOREIGN KEY</member>
    </simplelist>
  </refsect2>
 
  <refsect2 id="R2-SQL-UNIQUECLAUSE-4">
   <title>
    UNIQUE <!-- Constraint -->制約
   </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="UNIQUEせいやく">UNIQUE制約</secondary></indexterm>

<synopsis>
[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] UNIQUE ( <replaceable class="parameter">column</replaceable> [, ... ] )
</synopsis>

   <refsect3>
    <title><!-- Inputs -->入力</title>
    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">constraint_name</replaceable></term>
      <listitem>
       <para>
	<!-- An arbitrary name given to a constraint clause. -->
        制約句に与えられる任意の名前です。
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">column</replaceable></term>
      <listitem>
       <para>
	<!-- A name of a column in a table. -->
         テーブル内の列名です。
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
   </refsect3>

   <refsect3>
    <title><!-- Outputs -->出力</title>

     <variablelist>
      <varlistentry>
       <term><replaceable>status</replaceable></term>
       <listitem>
	 <variablelist>
	  <varlistentry>
	   <term>ERROR: Cannot insert a duplicate key into a unique index</term>
	   <listitem>
	    <para>
             <!-- 
	     This error occurs at runtime if one tries to insert a
	     duplicate value into a column. -->

             実行時に重複した値が挿入されようとしたときに出力されるエラーです。 

	    </para>
	   </listitem>
	  </varlistentry>
	 </variablelist>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>
   
   <refsect3>
    <title>
     <!-- Description -->説明
    </title>
    
    <para>
     <!--  
     The UNIQUE constraint specifies a rule that a group of one or more
     distinct columns of a table may contain only unique values. The
     behavior of the UNIQUE table constraint is the same as that for
     column constraints, with the additional capability to span multiple
     columns. -->

     UNIQUE制約はテーブルの1つ以上の特定の列のグループが一意な値のみを保持できることを指定します。UNIQUEテーブル制約の動作は列制約と同じで、さらに複数の列に渡る機能があります。

    </para>
    <para>
     <!-- 
     See the section on the UNIQUE column constraint for more details.
     -->
     詳細はUNIQUE列制約の節を参照してください。 

    </para>
   </refsect3>

   <refsect3 id="R3-SQL-UNIQUECLAUSE-4">
    <title>
     <!-- Usage -->使用方法
    </title>
    
    <para>
     <!-- Prevent duplicate rows in the table distributors: -->
      テーブルdistributorsの中で複製の行を禁止するには以下のようにします。
</para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(did,name)
);
</programlisting>
   </refsect3>
  </refsect2>

  <refsect2 id="R2-SQL-PRIMARYKEY-4">
   <title>
    PRIMARY KEY<!-- Constraint-->制約
   </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="PRIMARY KEYせいやく">PRIMARY KEY制約</secondary></indexterm>

<synopsis>
[ CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ] PRIMARY KEY ( <replaceable class="PARAMETER">column</replaceable> [, ... ] ) 
</synopsis>

   <refsect3>
    <title><!-- Inputs -->入力</title>

     <variablelist>
      <varlistentry>
       <term><replaceable class="PARAMETER">constraint_name</replaceable></term>
       <listitem>
	<para>
	 <!-- An arbitrary name given to a constraint clause. -->
         制約句に与えられる任意の名前です。
	</para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term><replaceable class="PARAMETER">column</replaceable> [, ... ]</term>
       <listitem>
	<para>
	<!--  The names of one or more columns in the table. -->
        テーブル内の1つ以上の列の名前です。
	</para>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>
   
   <refsect3>
    <title><!-- Outputs -->出力</title>
    <variablelist>
     <varlistentry>
      <term><replaceable>status</replaceable></term>
      <listitem>
	<variablelist>
	 <varlistentry>
	  <term>ERROR: Cannot insert a duplicate key into a unique index.</term>
	  <listitem>
	   <para>
            <!-- 
	    This occurs at run-time if one tries to insert a duplicate
	    value into a column subject to a PRIMARY KEY constraint.
            -->
            実行時に重複した値が、PRIMARY KEY制約条件となる列に挿入されようとしたときに出力されるエラーです。

	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
      </listitem>
     </varlistentry>
    </variablelist>
   </refsect3>
   
   <refsect3>
    <title><!-- Description -->説明</title>
    <para>
     <!--  
     The PRIMARY KEY constraint specifies a rule that a group of one
     or more distinct columns of a table may contain only unique
     (nonduplicate), non-null values. The column definitions of
     the specified columns do not have to include a NOT NULL
     constraint to be included in a PRIMARY KEY constraint. -->

     PRIMARY KEY制約条件は、テーブルの1つ以上の独立したそれぞれの列のグループが一意（重複しない）で、かつNULLでない値のみが許されるというルールを指定します。指定された列の列定義では、PRIMARY KEY制約条件に含まれるNOT NULL制約条件を含んではいけません。
 
    </para>

    <para>
    <!--  
    The PRIMARY KEY table constraint is similar to that for column constraints,
     with the additional capability of encompassing multiple columns.
    -->

     PRIMARY KEYテーブル制約条件は、列制約条の件のPRIMARY KEY制約条件と類似したものですが、複数のカラムに拡張した追加機能があります。

    </para>
    <para>
     <!-- 
     Refer to the section on the PRIMARY KEY column constraint for more
     information. -->

     詳細については、PRIMARY KEY列制約条件の節を参照してください。 

    </para>
   </refsect3>
  </refsect2>

  <refsect2 id="R2-SQL-REFERENCES-2">
   <refsect2info>
    <date>2000-02-04</date>
   </refsect2info>
   <title>
    REFERENCES <!-- Constraint -->制約
   </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="REFERENCESせいやく">REFERENCES制約</secondary></indexterm>
<synopsis>
[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] FOREIGN KEY ( <replaceable class="parameter">column</replaceable> [, ... ] )
    REFERENCES <replaceable class="parameter">reftable</replaceable> [ ( <replaceable class="parameter">refcolumn</replaceable> [, ... ] ) ] 
    [ MATCH <replaceable class="parameter">matchtype</replaceable> ]
    [ ON DELETE <replaceable class="parameter">action</replaceable> ] 
    [ ON UPDATE <replaceable class="parameter">action</replaceable> ]
    [ [ NOT ] DEFERRABLE ]
    [ INITIALLY <replaceable class="parameter">checktime</replaceable> ]
</synopsis>
   <para>
    <!--  
    The REFERENCES constraint specifies a rule that a column value or set
    of column values is
    checked against the values in another table. -->

    REFERENCES制約は、列の値または列の値の集合が別のテーブルの値とチェックされることを指定します。

   </para>

   <refsect3 id="R3-SQL-REFERENCES-5">
    <title><!-- Inputs -->入力</title>

     <variablelist>
      <varlistentry>
       <term><replaceable class="PARAMETER">constraint_name</replaceable></term>
       <listitem>
	<para>
	 <!-- An arbitrary name given to a constraint clause. -->
         制約句に与えられる任意の名前です。
	</para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term><replaceable class="PARAMETER">column</replaceable> [, ... ]</term>
       <listitem>
	<para>
	 <!-- The names of one or more columns in the table. -->
         テーブル内の1つ以上の列の名前です。
	</para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term><replaceable class="parameter">reftable</replaceable></term>
       <listitem>
        <para>
         <!-- 
         The table that contains the data to check against. -->
         チェックをするデータを持つテーブルです。
        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term><replaceable class="parameter">referenced column</replaceable> [, ... ]</term>
       <listitem>
        <para>
         <!-- One or more columns in the 
         <replaceable class="parameter">reftable</replaceable>
         to check the data against.  If this is not specified, 
         the PRIMARY KEY of the
         <replaceable class="parameter">reftable</replaceable> is used.
         -->

         <replaceable class="parameter">reftable</replaceable>内でデータをチェックする1つ以上の列です。指定されない場合、<replaceable class="parameter">reftable</replaceable>のPRIMARY KEYが使われます。
  
        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>MATCH <replaceable class="parameter">matchtype</replaceable></term>
       <listitem>
        <para>
         <!-- 
         There are three match types: MATCH FULL, MATCH PARTIAL, and a
         default match type if none is specified. MATCH FULL will not
         allow one column of a multi-column foreign key to be NULL
         unless all foreign key columns are NULL. The default MATCH type
         allows some foreign key columns to be NULL while other parts
         of the foreign key are not NULL. MATCH PARTIAL is currently not
	 supported. -->
         MATCH型には3つあります。MATCH FULL、MATCH PARTIAL、そして指定がない場合はデフォルトのMATCH型です。MATCH FULLは、すべての外部キー列がNULLでない限り複数列の外部キーの一列がNULLになることを認めません。デフォルトのMATCH型は、外部キーの他の部分がNULLではない間、いくつかの外部キー列がNULLになることを認めます。MATCH PARTIALは現在のところサポートされていません。

        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>ON DELETE <replaceable class="parameter">action</replaceable></term>
       <listitem>
        <para>
         <!-- 
	 The action to do when a referenced row in the referenced table is being
         deleted.  There are the following actions. -->

         参照されるテーブルの参照される行が削除されるときに行われる動作です。以下の動作があります。
</para>

         <variablelist>
          <varlistentry>
           <term>NO ACTION</term>
           <listitem>
            <para>
             <!-- 
             Produce error if foreign key violated.  This is the default.
             -->
             外部キーが違反された場合にエラーを表示します。これがデフォルトです。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>RESTRICT</term>
           <listitem>
            <para>
             <!-- Same as NO ACTION. -->
             NO ACTIONと同じです。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>CASCADE</term>
           <listitem>
            <para>
             <!-- Delete any rows referencing the deleted row.
             -->
              削除された行を参照する行を削除します。

            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET NULL</term>
           <listitem>
            <para>
             <!-- Set the referencing column values to NULL. -->
             参照する列の値をNULLに設定します。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET DEFAULT</term>
           <listitem>
            <para>
             <!-- Set the referencing column values to their default value.
             -->

             参照する列の値をデフォルトに設定します。

            </para>
           </listitem>
          </varlistentry>
         </variablelist>
       </listitem>
      </varlistentry>      
      <varlistentry>
       <term>ON UPDATE <replaceable class="parameter">action</replaceable></term>
       <listitem>
        <para>
          <!-- 
	 The action to do when a referenced column in the referenced
	 table is being updated to a new value. If the row is updated,
	 but the referenced column is not changed, no action is done.
	 There are the following actions. -->

         参照されるテーブルの参照される列が新しい値に更新されるときに行う動作です。もし行が更新され、しかし参照される列が変わっていない場合、何も動作は起きません。動作には以下のものがあります。
</para>

         <variablelist>
          <varlistentry>
           <term>NO ACTION</term>
           <listitem>
            <para>
             <!--  
             Produce error if foreign key violated.  This is the default.
             -->
             外部キーが違反されるとエラーを表示します。これはデフォルトです。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>RESTRICT</term>
           <listitem>
            <para>
             <!-- Disallow update of row being referenced.-->
             参照される行の更新を不可能にします。<indexterm><primary>RESTRICT</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary>RESTRICT</secondary></indexterm>
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>CASCADE</term>
           <listitem>
            <para>
             <!-- 
             Update the value of the referencing column to the new value
             of the referenced column. -->
             参照する列の値を参照される列の新しい値に更新します。<indexterm><primary>CASCADE</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary>CASCADE</secondary></indexterm>

            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET NULL</term>
           <listitem>
            <para>
             <!-- Set the referencing column values to NULL. -->
             参照する列の値をNULLに設定します。
            </para>
           </listitem>
          </varlistentry>
          <varlistentry>
           <term>SET DEFAULT</term>
           <listitem>
            <para>
             <!-- 
             Set the referencing column values to their default value.
             -->

             参照する列の値をデフォルト値に設定します。
  
            </para>
           </listitem>
          </varlistentry>
         </variablelist>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term> [ NOT ] DEFERRABLE </term>
       <listitem>
        <para>
         <!-- 
         This controls whether the constraint can be deferred to the end
         of the transaction. If DEFERRABLE, SET CONSTRAINTS ALL DEFERRED
         will cause the foreign key to be checked only at the end of the
         transaction. NOT DEFERRABLE is the default. -->

         これは、制約がトランザクションの終わりまで延期できるかどうかを管理します。DEFERRABLEの場合、SET CONSTRAINTS ALL DEFERREDは外部キーがトランザクションの終わりでのみチェックするようにします。デフォルトはNOT DEFERRABLEです。<indexterm><primary>DEFERRABLE</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary>DEFERRABLE</secondary></indexterm>

        </para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>INITIALLY <replaceable class="parameter">checktime</replaceable></term>
       <listitem>
        <para>
         <!-- 
         <replaceable class="parameter">checktime</replaceable> has two
         possible values which specify the default time to check the
         constraint. -->

         <replaceable class="parameter">checktime</replaceable>は、制約をチェックするデフォルトの時間を指定する可能な値を2つ持っています。
</para>

         <variablelist>
          <varlistentry>
           <term>IMMEDIATE</term>
	   <listitem>
	    <para>
	     <!-- Check constraint after each statement. This is the default.-->
             それぞれの文の後で制約をチェックします。これがデフォルトです。
	    </para>
	   </listitem>
          </varlistentry>
          <varlistentry>
           <term>DEFERRED</term>
	   <listitem>
	    <para>
             <!-- 
	     Check constraint only at the end of the transaction.
             -->
             トランザクションの終わりのみで制約をチェックします。
	    </para>
	   </listitem>
          </varlistentry>
         </variablelist>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>


   <refsect3 id="R3-SQL-REFERENCES-6">
    <refsect3info>
     <date>2000-02-04</date>
    </refsect3info>
    <title>
     <!-- Outputs -->出力
    </title>

     <variablelist>
      <varlistentry>
       <term><replaceable>status</replaceable></term>
       <listitem>

	 <variablelist>
	  <varlistentry>
	   <term><computeroutput>
ERROR:  <replaceable class="parameter">name</replaceable> referential integrity violation - key referenced from 
<replaceable class="parameter">table</replaceable> not found in <replaceable class="parameter">reftable</replaceable>
	    </computeroutput></term>
	   <listitem>
	    <para>
             <!-- 
             This error occurs at runtime if one tries to insert a value
             into a column which does not have a matching column in the
             referenced table. -->

             このエラーは、参照されるテーブルに照合する列を持たない列に値を挿入しようとした場合に、実行時に起こります。
     
	    </para>
	   </listitem>
	  </varlistentry>
	 </variablelist>

       </listitem>
      </varlistentry>
     </variablelist> 
   </refsect3>


   <refsect3>
    <title><!-- Description -->説明</title>
    <para>
     <!-- 
     The FOREIGN KEY constraint specifies a rule that a group of one
     or more distinct columns of a table is related to a group
     of distinct columns in the referenced table. -->

     FOREIGN KEY制約はテーブルの1つ以上の特定の列が参照されるテーブルの特定の列と関連することを指定します。 

    </para>

    <para>
     <!--  
     The FOREIGN KEY table constraint is similar to that for column
     constraints, with the additional capability of encompassing
     multiple columns. -->

     FOREIGN KEYテーブル制約は列制約と似ていますが、複数のカラムに拡張した追加機能があります。

    </para>
    <para>
     <!-- 
     Refer to the section on the FOREIGN KEY column constraint for more
     information. -->

     詳細はFOREIGN KEY列制約の節を参照してください。
    </para>
   </refsect3>
   
  </refsect2>

 </refsect1>
 
 <refsect1 id="R1-SQL-CREATETABLE-2">
  <title>
   <!-- Usage -->使用方法
  </title>
  <para>
   <!--   
   Create table films and table distributors: -->
   テーブルfilmsとテーブルdistributorsを作るには以下のようにします。
</para>

<programlisting>
CREATE TABLE films (
     code      CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
     title     CHARACTER VARYING(40) NOT NULL,
     did       DECIMAL(3) NOT NULL,
     date_prod DATE,
     kind      CHAR(10),
     len       INTERVAL HOUR TO MINUTE
);
</programlisting>

<programlisting>
CREATE TABLE distributors (
     did      DECIMAL(3) PRIMARY KEY DEFAULT NEXTVAL('serial'),
     name     VARCHAR(40) NOT NULL CHECK (name &lt;&gt; '')
);
</programlisting>

  <para>
   <!-- Create a table with a 2-dimensional array: -->
   2次元配列を持つテーブルを作るには以下のようにします。
</para>

<programlisting>
   CREATE TABLE array (
          vector INT[][]
          );
</programlisting>

  <para>
   <!-- 
   Define a UNIQUE table constraint for the table films.
   UNIQUE table constraints can be defined on one or more
   columns of the table: -->
 
   テーブルfilmsにUNIQUEテーブル制約を定義するには以下のようにします。UNIQUEテーブル制約はそのテーブルの1つ以上の列に定義することができます。
</para>

<programlisting>
CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(3),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT production UNIQUE(date_prod)
);
</programlisting>
  
  <para>
   <!-- Define a CHECK column constraint: -->
   CHECK列制約を定義するには以下のようにします。
</para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3) CHECK (did > 100),
    name     VARCHAR(40)
);
</programlisting>

  <para>
   <!-- Define a CHECK table constraint: -->
   CHECKテーブル制約を定義するには以下のようにします。
</para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40)
    CONSTRAINT con1 CHECK (did > 100 AND name > '')
);
</programlisting>
 
  <para>
   <!-- 
   Define a PRIMARY KEY table constraint for the table films.
   PRIMARY KEY table constraints can be defined on one or more
   columns of the table: -->

   テーブルfilmsにPRIMARY KEYテーブル制約を定義するには以下のようにします。
   PRIMARY KEYテーブル制約はテーブルの1つ以上の列に定義することができます。
</para>

<programlisting>
CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(3),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);
</programlisting>

  <para>
   <!-- 
   Defines a PRIMARY KEY column constraint for table distributors.
   PRIMARY KEY column constraints can only be defined on one column
   of the table (the following two examples are equivalent): -->

   テーブル配布にPRIMARY KEY列制約を定義するには以下のようにします。PRIMARY KEY列制約はテーブルの1つの列上にのみ定義することができます（以下の2つの例は同じものです）。
</para>


<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     CHAR VARYING(40),
    PRIMARY KEY(did)
); 
</programlisting>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3) PRIMARY KEY,
    name     VARCHAR(40)
);
</programlisting>
  
 </refsect1>
 
 <refsect1 id="R1-SQL-CREATETABLE-3">
  <title>
   <!-- Compatibility -->互換性
  </title>

  <refsect2 id="R2-SQL-CREATETABLE-4">
   <title>
    SQL92
   </title>
   <para>
    <!-- 
    In addition to the locally visible temporary table, SQL92 also defines a
    CREATE GLOBAL TEMPORARY TABLE statement, and optionally an 
    ON COMMIT clause: -->

    ローカルに可視的な暫定テーブルに加え、SQL92ではCREATE GLOBAL TEMPORARY TABLE文と、オプションでON COMMIT句も同時に定義しています。
</para>

<synopsis>
CREATE GLOBAL TEMPORARY TABLE <replaceable class="parameter">table</replaceable> ( <replaceable class="parameter">column</replaceable> <replaceable class="parameter">type</replaceable> [
    DEFAULT <replaceable class="parameter">value</replaceable> ] [ CONSTRAINT <replaceable class="parameter">column_constraint</replaceable> ] [, ... ] )
    [ CONSTRAINT <replaceable class="parameter">table_constraint</replaceable> ] [ ON COMMIT { DELETE | PRESERVE } ROWS ] 
</synopsis>

   <para>
    <!-- 
    For temporary tables, the CREATE GLOBAL TEMPORARY TABLE statement
    names a new table visible to other clients and defines the table's columns
    and constraints. -->

    暫定テーブルに対し、CREATE GLOBAL TEMPORARY TABLE文はほかのクライアントに可視的な新しいテーブルを指名し、テーブルのカラムと制約条件を定義します。

   </para>

   <para>
    <!-- 
    The optional ON COMMIT clause of CREATE TEMPORARY TABLE specifies
    whether or not the temporary table should be emptied of rows
    whenever COMMIT is executed. If the ON COMMIT clause is omitted, SQL92
    specifies that the default is ON COMMIT DELETE ROWS.  However,
    <productname>Postgres</productname>' behavior is always like
    ON COMMIT PRESERVE ROWS. -->

    CREATE TEMPORARY TABLEのオプションのON COMMIT句は、COMMITが実行されたときに、一時テーブルの行を空にするかどうかを指定します。ON COMMIT句が省略された場合、SQL92はデフォルトがON COMMIT DELETE ROWSであると指定しています。しかし<productname>Postgres</productname>の動作は常にON COMMIT PRESERVE ROWSのようになります。

   </para>

   <refsect3 id="R3-SQL-UNIQUECLAUSE-1">
    <title>
     UNIQUE<!-- clause -->句
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="UNIQUEく">UNIQUE句</secondary></indexterm>
    <para>
     <!-- SQL92 specifies some additional capabilities for UNIQUE: -->
     SQL92は、いくつかの追加機能をUNIQUEに指定しています。
    </para>
    <para>
     <!-- Table Constraint definition: -->
      テーブル制約の定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] UNIQUE ( <replaceable>column</replaceable> [, ... ] )
    [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>

    <para>
     <!-- Column Constraint definition: -->
      列制約の定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] UNIQUE
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
</synopsis>
   </refsect3>
   
   <refsect3 id="R3-SQL-NULL-1">
    <title>
     NULL<!-- clause -->句
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="NULLく">NULL句</secondary></indexterm>
    <para>
	<!-- The NULL "constraint" (actually a non-constraint) is a
	<productname>Postgres</productname> extension to SQL92 that is
	included for symmetry with the NOT NULL clause (and for compatibility
	with some other RDBMSes). Since it is the
	default for any column, its presence is simply noise. -->

        NULL「制約」（実際は非制約です）は、SQL92の<productname>Postgres</productname>拡張で、NOT NULL句と対称になっています（そして他のいくつかのRDBMSとの互換性を保つためのものでもあります）。どの列でもこれがデフォルトなのでその存在は邪魔なだけです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] NULL 
</synopsis>
   </refsect3>
   
   <refsect3 id="R3-SQL-NOTNULL-4">
    <title>
     NOT NULL<!-- clause -->句
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="NOT NULLく">NOT NULL句</secondary></indexterm>
    <para>
     
     <!-- SQL92 specifies some additional capabilities for NOT NULL:
     -->
     SQL92はいくつかの追加機能をNOT NULLに指定しています。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>
   </refsect3>
   
<!--
I can't figure out why DEFAULT clause is different from what we already have.
Perhaps because CURRENT_USER and CURRENT_DATE have specific types (currently
the "name" type), if you aren't careful then the types won't match up with
the column. Not our problem...
- Thomas 1998-08-16

   <REFSECT3 ID="R3-SQL-DEFAULTCLAUSE-1">
    <TITLE>
     DEFAULT clause
    </TITLE>
    <para>
     SQL92 specifies some additional capabilities for the DEFAULT clause.
     A DEFAULT clause is used to set the default value for a column
     or a domain.
    </para>
<synopsis>
DEFAULT niladic_user_function | niladic_datetime_function | NULL
</synopsis>
   </refsect3>
-->

   <refsect3 id="R3-SQL-CONSTRAINT-3">
    <title>
     CONSTRAINT<!-- clause -->句
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="CONSTRAINTく">CONSTRAINT句</secondary></indexterm>
    <para>
     <!-- 
     SQL92 specifies some additional capabilities for constraints,
     and also defines assertions and domain constraints. -->

     SQL92は、いくつかの追加機能を制約にしてしており、さらに表明（assert）とドメイン制約も定義しています。<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="ひょうめい">表明</secondary></indexterm><indexterm><primary>assert</primary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary>assert</secondary></indexterm>
</para>

     <note>
      <para>
       <!--  
       <productname>Postgres</productname> does not yet support 
       either domains or assertions. -->
       <productname>Postgres</productname>は、まだドメインも表明もサポートしていません。

      </para>
     </note>

    <para>
     <!-- 
     An assertion is a special type of integrity constraint and shares
     the same namespace as other constraints. However, an assertion is
     not necessarily dependent on one particular table as
     constraints are, so SQL-92 provides the CREATE ASSERTION statement
     as an alternate method for defining a constraint: -->

     表明（assert）は特殊な型の完全性保証制約条件で、他の制約と同じ名前空間を共有しています。しかし、表明は制約のように特定のテーブルに依存する必要はありませんので、SQL92は制約を定義する代替メソッドとしてCREATE ASSERTION文を提供しています。

    </para>
<synopsis>
CREATE ASSERTION <replaceable>name</replaceable> CHECK ( <replaceable>condition</replaceable> )
</synopsis>
    
    <para>
     <!--  
     Domain constraints are defined by CREATE DOMAIN or ALTER DOMAIN
     statements: -->

     ドメイン制約はCREATE DOMAINまたはALTER DOMAIN文で定義されています。

    </para>
    <para>
     <!-- Domain constraint: -->
     ドメイン制約は以下のとおりです。 
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] CHECK <replaceable>constraint</replaceable> 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>

    <para>
     <!-- Table constraint definition: -->
     テーブル制約定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] { PRIMARY KEY ( <replaceable class="parameter">column</replaceable>, ... ) | FOREIGN KEY <replaceable>constraint</replaceable> | UNIQUE <replaceable>constraint</replaceable> | CHECK <replaceable>constraint</replaceable> }
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>

    <para>
     <!-- Column constraint definition: -->
     列制約定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] { NOT NULL | PRIMARY KEY | FOREIGN KEY <replaceable>constraint</replaceable> | UNIQUE | CHECK <replaceable>constraint</replaceable> }  
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>

    <para>
     <!-- A CONSTRAINT definition may contain one deferment attribute
     clause and/or one initial constraint mode clause, in any order. -->

     CONSTRAINT定義は、1つの延期属性句または1つの初期制約モード句を任意の順番で持つことができます。
</para>
   
     <variablelist>
      <varlistentry>
       <term>NOT DEFERRABLE</term>
       <listitem>
	<para>
         <!-- 
         The constraint must be checked at the end of each statement.
         SET CONSTRAINTS ALL DEFERRED will have no effect on this type
         of constraint. -->

         制約はそれぞれの文の最後にチェックされなければなりません。SET CONSTRAINTS ALL DEFERREDはこの制約の型には何の影響も持ちません。

	</para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>DEFERRABLE</term>
       <listitem>
	<para>
         <!--  
         This controls whether the constraint can be deferred to the end
         of the transaction. If SET CONSTRAINTS ALL DEFERRED is used or
         the constraint is set to INITIALLY DEFERRED, this will cause
         the foreign key to be checked only at the end of the
         transaction. -->

         これは制約がトランザクションの最後まで延期できるかどうかを管理します。もしSET CONSTRAINTS ALL DEFERREDが使われるかまたは制約がINITIALLY DEFERREDの場合、外部キーがトランザクションの最後にのみチェックされるようになります。

	</para>
        <note>
         <para>  
          <!--  
          <command>SET CONSTRAINTS</> changes the foreign key constraint mode
          only for the current transaction. -->

          <command>SET CONSTRAINTS</>は外部キー制約を現在のトランザクションのみの適用に変えます。

         </para>
        </note>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>INITIALLY IMMEDIATE</term>
       <listitem>
	<para>
         <!-- 
	 Check constraint after each statement. This is the default.-->
         それぞれの文の後で制約をチェックします。これがデフォルトです。

	</para>
       </listitem>
      </varlistentry>
      <varlistentry>
       <term>INITIALLY DEFERRED</term>
       <listitem>
	<para>
         <!-- 
         Check constraint only at the end of the transaction. -->
         トランザクションの最後のみで制約をチェックします。

	</para>
       </listitem>
      </varlistentry>
     </variablelist>
   </refsect3>
   
   
   <refsect3 id="R3-SQL-CHECK-4">
    <title>
     <!-- CHECK clause -->
     CHECK句
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="CHECKく">CHECK句</secondary></indexterm>
    <para>
     <!-- 
     SQL92 specifies some additional capabilities for CHECK in either
     table or column constraints. -->

     SQL92は、CHECKにテーブルまたは列制約でいくつかの追加機能を指定しています。

    </para>
<!--
Constraints associated with domains do not need to be mentioned here,
even though it is the case that a domain constraint may possibly
affect a column or a table.
- Thomas 1998-08-16
    <para>
     A CHECK constraint is either a table constraint, a column
     constraint or a domain constraint.
    </para> 
-->
    <para>
     <!-- table constraint definition: -->
     テーブル制約の定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] CHECK ( VALUE <replaceable>condition</replaceable> ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
</synopsis>

    <para>
     <!-- column constraint definition: -->
     列制約の定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] CHECK ( VALUE <replaceable>condition</replaceable> ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
</synopsis>

<!--
   <para>
     domain constraint definition: 
    </para>
<synopsis>
     [ CONSTRAINT name] 
      CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
</synopsis>
    <para>
     CHECK domain constraints can be defined in either
     a CREATE DOMAIN statement or an ALTER DOMAIN statement:
    </para>
<programlisting>
CREATE DOMAIN duration AS SMALLINT 
    CONSTRAINT minutes CHECK (VALUE IN (90,120,180,240)); 

ALTER DOMAIN cities 
    ADD CONSTRAINT new_city CHECK (VALUE LIKE 'L%');
</programlisting>
-->
   </refsect3>

   <refsect3 id="R3-SQL-PRIMARYKEY-1">
    <title>
     <!-- PRIMARY KEY clause -->
     PRIMARY KEY句
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="PRIMARY KEYく">PRIMARY KEY句</secondary></indexterm>
    <para>
     <!--  
     SQL92 specifies some additional capabilities for PRIMARY KEY:
     -->

     SQL92は、PRIMARY KEYにいくつかの追加機能を指定しています。

    </para>
    <para>
     <!-- Table Constraint definition: -->
     テーブル制約定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] PRIMARY KEY ( <replaceable>column</replaceable> [, ... ] ) 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>

    <para>
     <!-- Column Constraint definition: -->
     列制約定義は以下のとおりです。
</para>

<synopsis>
[ CONSTRAINT <replaceable>constraint_name</replaceable> ] PRIMARY KEY 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
</synopsis>
   </refsect3>

   <refsect3 id="R3-SQL-INHERITANCE-1">
    <title>
     <!-- Inheritance -->継承
    </title>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="けいしょう">継承</secondary></indexterm>
    <para>
     <!-- Multiple inheritance via the INHERITS clause is a
     <productname>Postgres</productname> language extension.
     SQL99 (but not SQL92) defines single inheritance using a different
     syntax and different semantics.  SQL99-style inheritance is not yet
     supported by <productname>Postgres</productname>. -->

     INHERITS句による複数継承は、<productname>Postgres</productname>言語の拡張です。SQL99（SQL92ではありませんが）は異なった構文と異なった意味論を使った単一継承を定義しています。SQL99方式の継承はまだ<productname>Postgres</productname>ではサポートされていません。

    </para>
   </refsect3>
  </refsect2>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
