CREATE TABLE

フィールド定義
サポートされるデータ型
フィールド制約
表作成例

表定義を作成するには、CREATE TABLE文を使用します。次のような形式になります。

CREATE TABLE [IF NOT EXISTS] table-name (
    field-definition, field-definition-2 ..., 
    PRIMARY KEY (field-name, field-name-2...),
    [COMMENT "comment string"]
)

説明:

フィールド定義

表を定義する場合、フィールド定義は次の形式になります。

field-name type [constraints] [COMMENT "comment-string"] 

説明:

  • field-nameはフィールドの名前です。たとえば、idまたはfamiliarNameです。すべてのフィールドには名前が必要です。

  • typeはフィールドのデータ型を示します。INTEGERまたはSTRINGのようなシンプルな型、またはRECORDのような複合型にすることができます。使用可能な型のリストは次の項で説明します。

  • constraintsは、フィールドに含まれるデータの制約を説明します。つまり、最小値か最大値、使用可能な範囲またはデフォルト値です。この情報はオプションです。詳細は、「フィールド制約」を参照してください。

  • COMMENTはオプションです。これは、フィールドの簡単な説明に使用できます。コメントは解釈されませんが、表のメタデータに入れられます。

サポートされるデータ型

表フィールドでは、次のデータ型がサポートされます。

  • ARRAY

    データの配列です。配列のすべての要素は同じデータ型である必要があり、配列フィールドを定義するときにこの型を宣言する必要があります。たとえば、次のように文字列の配列を定義します。

    myArray ARRAY(STRING)

    配列値にはフィールド制約を適用できます。次に例を示します。

    myArray ARRAY(INTEGER CHECK(ELEMENTOF(myArray) > 0 and \
    ELEMENTOF(myArray) < 100))

    CHECK文の説明は「CHECK」を参照してください。

  • BINARY

    バイナリ・データ。

  • BINARY(長さ)

    長さ(バイト数)のサイズの固定長バイナリ・フィールド。

  • BOOLEAN

    ブール・データ型。

  • DOUBLE

    double。

  • ENUM

    列挙リスト。フィールド定義では、使用可能な列挙値を指定する必要があります。次に例を示します。

    fruitName ENUM(apple,pear,orange)
  • FLOAT

    float。

  • INTEGER

    整数。

  • LONG

    long。

  • MAP

    データ・マップ。すべてのマップ・キーは文字列ですが、これらのフィールドを定義するときにはマップのデータ部分のデータ型を定義する必要があります。たとえば、キーが整数値にマップする場合、次のようにフィールドを定義します。

    myMap MAP(INTEGER)

    マップ値にフィールド制約を適用できることに注意してください。次に例を示します。

    myMap MAP(INTEGER CHECK(ELEMENTOF(myMap) > 0 and \
    ELEMENTOF(myMap) < 13))

    CHECK文の説明は「CHECK」を参照してください。

  • RECORD

    埋込みレコード。フィールド定義は埋込みレコードに含まれるすべてのフィールドを定義する必要があります。適用される同じ構文ルールはすべて通常の表フィールドの定義に使用されます。たとえば、シンプルな埋込みレコードは次のように定義されます。

    myEmbeddedRecord RECORD(firstField STRING, secondField INTEGER)

    データ制約、デフォルト値なども埋込みレコードのフィールド定義に使用できます。

  • STRING

    文字列。

フィールド制約

フィールド制約は、使用可能な値の範囲およびデフォルト値のようなフィールドに関する情報の定義に使用されます。次に例を示します。

day_of_month CHECK (day_of_month >= 1 AND day_of_month <= 31)

すべてのデータ型が制約をサポートするわけではなく、各データ型がすべての使用可能な制約をサポートするわけではありません。

CHECK

CHECKを使用して使用可能な値の範囲を指定します。シンボルAND<<=>および>=のすべてがサポートされます。<=および>=が含まれる範囲を指定し、<および>が除外する範囲を指定します。次に例を示します。

myInt INTEGER CHECK(myInt > 10 and myInt < 20)

前述の例で示すように、シンプルなデータ型(INTEGER、LONG、FLOAT、DOUBLE、STRING)では、フィールド名を使用して範囲を指定します。

STRINGデータ型では、範囲は使用可能な文字列の長さを指定します。

MAPおよびARRAYデータ型では、CHECKを使用して使用可能な値の範囲を制限できます。ELEMENTOF()を使用して、MAPまたはARRAYの値を参照します。次に例を示します。

myMap MAP(INTEGER CHECK(ELEMENTOF(myMap) > 10))

または

myArray ARRAY(INTEGER CHECK(ELEMENTOF(myArray) > 100 AND \
ELEMENTOF(myArray) < 1000))

CHECKはBINARY、BOOLEAN、ENUMまたはRECORDデータ型ではサポートされませんが、RECORDで定義される各フィールドではCHECKがサポートされます。

myRec RECORD(a STRING, b INTEGER CHECK(b >= 0 AND b <= 10))

COMMENT

すべてのデータ型は制約の一部としてCOMMENTを受け入れられます。COMMENT文字列は解析されませんが、表のメタデータの一部になります。次に例を示します。

myRec RECORD(a STRING, b INTEGER) COMMENT "Comment string"

または

myInt INTEGER CHECK(myInt > 10 and myInt < 20) COMMENT "Comment string"

DEFAULT

ARRAY、BINARY、MAPおよびRECORD以外のすべてのフィールドではDEFAULT制約を受け入れられます。DEFAULTによって指定される値は、表がストアに書き込まれる際にフィールド・データが指定されていないイベントで使用されます。

次に例を示します。

id INTEGER DEFAULT -1,
description STRING DEFAULT "NONE",
size ENUM(small,medium,large) DEFAULT medium,
inStock BOOLEAN DEFAULT FALSE

NOT NULL

NOT NULLは、フィールドをNULLにできないことを示します。この制限では、DEFAULT値も設定する必要があります。これらの制約では、順番は重要ではありません。次に例を示します。

id INTEGER NOT NULL DEFAULT -1,
description STRING DEFAULT "NONE" NOT NULL

表作成例

前述した概念を示すために、次に例を記述します。

CREATE TABLE users (
  id INTEGER,
  firstName STRING,
  lastName STRING,
  age INTEGER,
  PRIMARY KEY (id),
  COMMENT "This comment applies to the table itself"
) 
CREATE TABLE usersNoId (
  firstName STRING,
  lastName STRING COMMENT "This comment applies to this field only",
  age INTEGER CHECK (age > 0 AND age < 150),
  ssn STRING NOT NULL DEFAULT "xxx-yy-zzzz",
  PRIMARY KEY (SHARD(lastName), firstName)
) 
CREATE TABLE users.address (
  streetNumber INTEGER,
  streetName STRING,  // this comment is ignored by the DDL parser
  city STRING,
  /* this comment is ignored */
  zip INTEGER CHECK(zip > 11111 AND zip < 99999),
  addrType ENUM (home, work, other),
  PRIMARY KEY (addrType)
) 
CREATE TABLE complex (
  COMMENT "this comment goes into the table metadata"
  id INTEGER, 
  PRIMARY KEY (id), # this comment is just syntax
  nestedMap MAP(RECORD( m MAP(FLOAT), a ARRAY(RECORD(age INTEGER)))),
  address RECORD (street INTEGER, streetName STRING, city STRING, \
                  zip INTEGER COMMENT "zip comment"),
  friends MAP (STRING),
  floatArray ARRAY (FLOAT),
  aFixedBinary BINARY(5),
  days ENUM(mon, tue, wed, thur, fri, sat, sun) NOT NULL DEFAULT tue
)