Symfoware(R) Server RDBユーザーズガイド データベース定義編 - FUJITSU -
目次 索引 前ページ次ページ

上へ第2章 データベースの作成
上へ2.6 論理構造の定義

2.6.3 表定義

実表の定義は、CREATE TABLEを使用して行います。

表定義で定義する事項を以下に示します。

在庫管理データベースの実表の定義の例を以下に示します。スキーマSTOCKSに属する在庫表を定義するものとします。

在庫表を定義するCREATE TABLE文を図:在庫表を定義するCREATE TABLE文に示します。

図:在庫表を定義するCREATE TABLE文

CREATE TABLE   在庫表 ( 製品番号  SMALLINT NOT NULL,
          ↑     ↑      ↑     ↑
         表名    列名    データ型  列の制約
                      ↑
                     表要素

              製品名   NATIONAL CHARACTER(10) NOT NULL,
               ↑         ↑        ↑
              列名      データ型      列の制約
                      ↑
                     表要素
 
              在庫数量  INTEGER,
               ↑    ↑
               列名   データ型
                  ↑ 
                 表要素

              倉庫番号  SMALLINT,
               ↑     ↑
               列名    データ型
                   ↑
                  表要素

              PRIMARY KEY(製品番号) )
                   ↑
                表に対する一意性制約
                    ↑
                   表要素

              COMMENT '在庫品とその数量,格納倉庫の表'
                         ↑
                        注釈定義

■表

実表につける名前を指定します。表名は36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。表名は、スキーマ内で一意です。ほかのスキーマに同じ表名の表が定義されていてもかまいません。

スキーマ定義の要素として表定義を記述する場合、スキーマ名で修飾して表名を記述するときは、スキーマ定義で指定したスキーマ名と同じ名前を指定しなければなりません。スキーマ名での修飾を省略して表名を記述するときは、スキーマ定義で指定したスキーマ名で修飾したとみなされます。

表名は、データ操作のSQL文において、操作の対象となる表を指定するために使用します。

例1

いろいろな表名の例
CREATE TABLE STOCK ( … )   (1)
CREATE TABLE A1234 ( … )   (2)
CREATE TABLE 在庫表( … )   (3)
CREATE TABLE ストック( … )  (4)
CREATE TABLE すとっく( … )  (5)
CREATE TABLE STOCK( … ) (6)
CREATE TABLE stock( … ) (7)
CREATE TABLE A1234( … ) (8)
CREATE TABLE a1234( … ) (9)

(3)〜(9)は、日本語の表名です。(6)〜(9)は、(1)または(2)と混同しやすいので、使用しないことをお勧めします。

例2

誤った表名指定
CREATE SCHEMA  STOCKS
CREATE TABLE S.在庫表 ( ... ) ← スキーマ名がSTOCKSではありません。

例3

正しい表名指定
CREATE SCHEMA  STOCKS
CREATE TABLE STOCKS.在庫表 ( ... ) ← スキーマ名が一致しています。
CREATE TABLE 発注表 ( ... )     ← スキーマ名省略。スキーマ名は
                     STOCKSになります。

■列の定

表を構成する各列について、以下の事項を定義します。

列の定義には、列名と列のデータ型の指定が必要です。ほかの事項は必要に応じて指定します。

◆列

列につける名前を指定します。列名は36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列で指定します。列名は、表内で一意です。

いろいろな列名の例
CREATE TABLE S1.STOCK ( PNO    SMALLINT …  (1)
CREATE TABLE S1.STOCK ( COL1   SMALLINT …  (2)
CREATE TABLE S1.STOCK ( 製品番号 SMALLINT …  (3)
CREATE TABLE S1.STOCK ( セイヒン SMALLINT …  (4)
CREATE TABLE S1.STOCK ( せいひん SMALLINT …  (5)
CREATE TABLE S1.STOCK ( PNO  SMALLINT …  (6)
CREATE TABLE S1.STOCK ( pno  SMALLINT …  (7)
CREATE TABLE S1.STOCK ( COL1 SMALLINT …  (8)

(3)〜(8)は、日本語の列名です。(6)〜(8)は、(1)または(2)と混同しやすいので、使用しないことをお勧めします。

◆列のデータ

列のデータ型を指定します。指定できる型を表:列のデータ型に示します。格納するデータの種類およびデータの大きさ(長さ)によってデータ型を決めます。

例1

在庫表の製品名のデータ型を固定長10けたの文字列とします。
CREATE TABLE 在庫表  (製品名 CHARACTER(10) … )

例2

例1と同じ定義
CREATE TABLE 在庫表  (製品名 CHAR(10) … )

例3

在庫表の製品名のデータ型を可変長10けたの文字列とします。
CREATE TABLE 在庫表  (製品名 CHARACTER VARYING(10) … )

例4

例3と同じ定義
CREATE TABLE 在庫表  (製品名 VARCHAR(10) … )

例5

在庫表の製品名のデータ型を固定長10けたの各国語文字列とします。
CREATE TABLE 在庫表  (製品名 NATIONAL CHARACTER(10) … )

例6

在庫表の製品名のデータ型を可変長10けたの各国語文字列とします。
CREATE TABLE 在庫表  (製品名 NCHAR VARYING(10) … )

例7

在庫表の製品名のデータ型を可変長1けたの各国語文字列とします。
CREATE TABLE 在庫表  (製品名 NCHAR VARYING … )

例8

在庫表の在庫数量のデータ型をけた数10、小数点以下2けたの外部10進数とします。
CREATE TABLE 在庫表  (在庫数量 NUMERIC(10,2) … )

例9

在庫表の在庫数量のデータ型をけた数10、小数点以下2けたの内部10進数とします。
CREATE TABLE 在庫表  (在庫数量 DECIMAL(10,2) … )

例10

在庫表の在庫数量のデータ型を以下の整数とします。
−231〜231−1の整数
CREATE TABLE 在庫表  (在庫数量 INTEGER … )
−215〜215−1の整数
CREATE TABLE 在庫表  (在庫数量 SMALLINT … )

例11

在庫表の在庫数量のデータ型を精度22の概数とします。
CREATE TABLE 在庫表  (在庫数量 FLOAT(22) … )

例12

在庫表の在庫数量のデータ型を倍精度の概数とします。
CREATE TABLE 在庫表  (在庫数量 DOUBLE PRECISION … )

[表:列のデータ]

型種類

データ型指定形式

指定の意味

文字列型

CHARACTER(n)
CHAR(n)

固定長で長さn文字の文字列
(n)を省略すると1文字になります。
n:1〜32000

CHARACTER VARYING(n)
CHAR VARYING(n)
VARCHAR(n)

可変長で長さ最大n文字の文字列
(n)を省略すると1文字になります。
n:1〜32000

各国語
文字列型

NATIONAL CHARACTER(n)
NATIONAL CHAR(n)
NCHAR(n)

固定長で長さn文字の日本語文字列
(n)を省略すると1文字になります。
n:1〜16000

NATIONAL CHARACTER VARYING(n)
NATIONAL CHAR VARYING(n)
NCHAR VARYING(n)

可変長で長さ最大n文字までの日本語文字列
(n)を省略すると1文字になります。
n:1〜16000

真数型

NUMERIC(p,q)

けた数p、小数点以下qけたのゾーン形式10進数
p:1〜18 q:0〜p

DECIMAL(p,q)
DEC(p,q)

けた数p、小数点以下qけたのパック形式10進数
p:1〜18 q:0〜p

INTEGER
INT

-231〜231-1の整数

SMALLINT

-215〜215-1の整数

概数型

FLOAT(p)

仮数部が-2p〜2pの概数
p:1〜52
p=1〜23の場合はREALの扱い
p=24〜52の場合はDOUBLE PRECISIONの扱い

REAL

4バイトの浮動小数点数

DOUBLE PRECISION

8バイトの浮動小数点数

日時型

DATE

年から日までの10文字の日付を格納

TIME

時から秒までの8文字の時刻を格納

TIMESTAMP

年から秒までの19文字の時刻印を格納

時間隔型

INTERVAL 開始日時フィールド TO 終了日時フィールド

各フィールドの指定により、年〜月、日〜時刻の時間隔を格納 (詳細は“表:時間隔型の指定と意味”を参照)

BLOB

BINARY LARGE OBJECT(n単位)
BLOB(n単位)

バイナリ属性のデータを格納
単位にはK、MまたはGを指定します。単位は省略できません。
単位がKの場合) n :1 〜2097152
単位がMの場合) n :1 〜2048
単位がGの場合) n :1 または2

n:文字数
p:精度
q:位取り

[表:時間隔の指定と意味]

型種類

開始日時フィールド

終了日時フィールド

指定の意味

年・月型

YEAR(p)

桁数pの年を表す時間隔

MONTH

桁数pの年と月を表す時間隔

MONTH(p)

桁数pの月を表す時間隔

日・時型

DAY(p)

SECOND

桁数pの日と時間から秒を表す時間隔

MINUTE

桁数pの日と時間から分を表す時間隔

HOUR

桁数pの日と時間を表す時間隔

桁数pの日を表す時間隔

HOUR(p)

SECOND

桁数pの時間と分から秒を表す時間隔

MINUTE

桁数pの時間と分を表す時間隔

桁数pの時間を表す時間隔

MINUTE(p)

SECOND

桁数pの分と秒を表す時間隔

桁数pの分を表す時間隔

SECOND(p)

桁数pの秒を表す時間隔

p : 開始日時フィールドの精度(1〜9の整数を指定)

◆既定

列の値に対する省略値を指定できます。表に行を挿入するとき、該当列の値が指定されていない場合に、列に設定する値を指定します。

既定値として指定できる値には、定数、ログイン名(UNIX系の場合)またはログオン名(Windows NT、Windows 2000、Windows XPおよびWindows Server 2003の場合)、ナル値、現在の日付、現在の時刻、現在の時刻印および順序があります。

例1

在庫表の列“製品番号”の列定義の例
CREATE TABLE 在庫表 ( 製品番号 INTEGER DEFAULT 10
                      ↑
                    既定値指定
               :

例2

在庫表の列“製品番号”に対して、順序を使用した場合の列定義の例
CREATE TABLE 在庫表 ( 製品番号 INTEGER DEFAULT 順序1.NEXTVAL 
                         ↑
                       既定値指定
               :

◆列の制

列に対して、格納されるデータについての制約を指定できます。データ型指定のうしろに指定します。列の制約には以下の2つがあります。

NOT NULL制:
列のデータにナルを許さない場合、NOT NULLを指定します。
一意性制:
列のデータに同じ値が重複して存在することを許さない場合、UNIQUEまたはPRIMARY KEYを指定します。

一意性制約については、あとで詳しく説明します。

在庫表の製品番号の列定義の例を以下に示します。製品番号は次のように規定するものとします。

在庫表の列“製品番号”の列定義の例
CREATE TABLE   在庫表 ( 製品番号 INTEGER
                   NOT NULL
                   PRIMARY KEY
               :

◆列の注釈定

列に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

在庫表の“製品番号”列に、注釈を指定します。
CREATE TABLE 在庫表 ( 製品番号 SMALLINT … COMMENT 'PRODUCT-NO' )
                            ↑
                          注釈定義

■一意性制

表中のいくつかの列の組合せに対しての制約(表制)として一意性制約があります。あるいは、列制約として表の1つの列に対して指定される一意性制約もあります。

一意性制約を指定すると、指定された列または列の組は、同じ値を重複してもつことはできません。指定された列の値または列の組の値は、表中で一意に決定されます。一意性制約はUNIQUEまたはPRIMARY KEYにより指定します。

◆UNIQUE

指定された列または列の組の値について、表の中で同一の値をもつ行が存在することを許さない場合に指定します。指定形式は次のとおりです。

UNIQUE(列名[{,列名}…])

UNIQUEを指定した列については、列定義においてNOT NULLを指定しておかなければなりません。

“製品番号と製品名の両方がともに一致する行があってはならない”という制約を指定した在庫表を定義する例を以下に示します。

列の組に対して表制約を指定する例
CREATE TABLE 在庫表 (…, 

       UNIQUE( 製品番号 , 製品名 )← 表に対する一意性制約
            ↑     ↑
           列名    列名

この例のような一意性制約が指定された在庫表には、図:一意性制約に違反するデータの例の[3]と[4]のような行は存在しえません。図:一意性制約に違反するデータの例の場合、[3]と[4]の行は、製品番号が両者とも“123”であり、かつ、製品名が両者とも“冷蔵庫”であるため、一意性制約違反となります。[1]と[2]の行は製品名が一致しますが製品番号は異なるので、一意性制約違反にはなりません。同様に[5]と[6]の行および[7]と[8]の行も一意性制約違反にはなりません。なお、一意性制約が、製品番号にだけ指定されている場合には、図:一意性制約に違反するデータの例の[3]、[4]および[5]、[6]の行は一意性制約違反となります。

[図:一意性制約に違反するデータの例]

image

◆PRIMARY KEY

表の中でその行を一意に決定する列または列の組を主キといいます。主キーに指定された値は、表の中で同一の値をもつ行が存在することを許しません。指定形式は次のとおりです。

PRIMARY KEY (列名[{,列名}…]) 

PRIMARY KEYを指定した列については、列定義においてNOT NULLを指定しておかなければなりません。PRIMARY KEYは表定義中で一度しか指定できません。

在庫表の製品番号に関する一意性制約を表制約で指定する例を以下に示します。

表制約による製品番号の一意性制約の指定例
CREATE TABLE 在庫表 (…, 

          PRIMARY KEY ( 製品番号 )← 表に対する一意性制約
                  ↑
                  列名

■表の注釈定

表に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

在庫表に、文字列の注釈を指定します。
CREATE TABLE 在庫表 ( 製品番号  SMALLINT NOT NULL, …
            COMMENT '在庫品とその数量,格納倉庫の表'
                      ↑
                    注釈定義

目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2003