# CREATE TABLE 文

CREATE TABLE文により表を作成します。表には列および制約があって、情報が沿うべき規則が決められています。表ごとの制約は列の集合ないしは列を指定します。列にはデータ型が決まっていて、列の制約(列ごとの制約)があります。

表やデータベースの所有者は自動的に以下の権限を持ち、また他のユーザにこれらの権限を与える事ができます。

- INSERT
- SELECT
- REFERENCES
- TRIGGER
- UPDATE

これらの権限を表やデータベースの所有者から剥奪することはできません。

制約についての情報は、CONSTRAINT 節を参照してください。

列には既定値を与えることができます。既定値とは値が指定されなかったとき、列に挿入される値です。明示されない場合列の既定値はNULLです。詳細は列の既定値を参照してください。

`SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY`というシステムの手続を呼ぶことで、ページサイズのような記録の属性を設定することができます。

表を限定する場合、スキーマ名はSYSで始まってはなりません。

#### 構文

CREATE TABLEには二通りの書き方があります。これは、列の定義と制約を指定しようとするか、問い合わせ式の結果に基づき列を定義するかによります。

    CREATE TABLE 表名
        ( {列定義 | 表毎制約}
        [ , {列定義 | 表毎制約} ] * )
      |
          [ ( 列名 [ , 列名 ] * ) ]
          AS 問い合わせ式
          WITH NO DATA
       }

#### 例

    CREATE TABLE HOTELAVAILABILITY
         (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
    	ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
    -- 表で主キーを定義することで、2列からなる主キーを定義できます。
    PRIMARY KEY (hotel_id, booking_date))
    -- 識別子列の属性を、INTEGERの列に与え、
    -- さらに列に主キー制約を定義します。
    CREATE TABLE PEOPLE
    	(PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY
    	CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
    -- 識別子列の属性を、SMALLINTの列に与え、
    -- 初期値を5に増分値を5に設定します。
    CREATE TABLE GROUPS
    	(GROUP_ID SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY
    	(START WITH 5, INCREMENT BY 5), ADDRESS VARCHAR(100), PHONE VARCHAR(15));

注: さまざまな制約を使った、より多くのCREATE TABLE文の例がCONSTRAINT 節にあります。

#### CREATE TABLE ... AS ...

もう一つのCREATE TABLE文の書き方は、問い合わせで列の名前と/あるいは列のデータ型を指定します。問い合わせ結果の列は、新しい表の各列を作成するときにモデルとして利用されます。

新しい表に列名が指定されなかった場合、問い合わせの結果の全列が、新しい表に同じ名前と対応するデータ型で作成されます。 ひとつあるいはそれ以上の列の名前が新しい表に指定された場合、問い合わせ式の結果には同数の列が無ければなりません。問い合わせ結果の列のデータ型は新しい表の対応する列に引き継がれます。

WITH NO DATA節は問い合わせ結果行のデータは使われず、列の名称と型だけが利用されることを表します。 WITH NO DATAは必ず指定してください。今後のリリースにて、DerbyでもWITH DATAを指定して、問い合わせ式の結果を新規作成された表に挿入するように出来るようになるかもしれません。しかし現在のリリースでは、WITH NO DATAの文しか処理されません。

#### 例

    -- 既存の表の全列とデータ型を使って新しい表を作成する。
    CREATE TABLE T3 AS SELECT * FROM T1 WITH NO DATA;
    -- 列に名前を指定して表を作成する。そのデータ型は既存表の列に沿ったものとする。
    CREATE TABLE T3 (A,B,C,D,E) AS SELECT * FROM T1 WITH NO DATA;
    -- 列に名前を指定して表を作成する。そのデータ型は既存表の指定された列のデータ型に沿ったものとする。
    CREATE TABLE T3 (A,B,C) AS SELECT V,DP,I FROM T1 WITH NO DATA;
    -- この例では問い合わせ式の結果にある列に名前がないが、そのデータ型は新規作成された表にて対応する列のデータ型となる。
    CREATE TABLE T3 (X,Y) AS SELECT 2*I,2.0*F FROM T1 WITH NO DATA;

- 列定義
- 発番列仕様

親トピック: CREATE 文
関連資料
CREATE FUNCTION 文
CREATE INDEX 文
CREATE PROCEDURE 文
CREATE SCHEMA 文
CREATE SYNONYM 文
CREATE TRIGGER 文
CREATE VIEW 文