表定義を作成するには、CREATE TABLE
文を使用します。次のような形式になります。
CREATE TABLE [IF NOT EXISTS] table-name ( field-definition, field-definition-2 ..., PRIMARY KEY (field-name, field-name-2...), [COMMENT "comment string"] )
説明:
IF NOT EXISTS
はオプションで、指定した名前の表がストア内にすでに存在し、表の定義が指定した定義と完全に一致する場合、表作成をサイレントにスキップします。文の実行の結果としてエラーは返されません。
この文のフレーズが指定されていない場合、ストア内で表名が重複することになるため、表の作成が失敗します。
table-nameは表の名前です。このフィールドは必須です。サブ表を作成する場合、ドット表記法を使用します。たとえば、表にUsers
という名前を付けることができます。次にUsers.MailingAddress
という名前のサブ表を定義できます。
field-definitionはカンマ区切りのフィールドのリストです。すべての表には1つ以上のフィールド定義があります。フィールド定義はこの項でこの後に説明します。
PRIMARY KEY
では、表の少なくとも1つのフィールドを主キーとして指定します。すべての表に主キー定義が必要です。主キーの詳細は「主キー」を参照してください。
シャード・キー(オプション)を定義するには、主キー文でSHARDキーワードを使用します。シャード・キーの詳細は「シャード・キー」を参照してください。
次に例を示します。
PRIMARY KEY (SHARD(id), lastName)
COMMENT
はオプションです。これは、表の簡単な説明に使用できます。コメントは解釈されませんが、表のメタデータに入れられます。
表を定義する場合、フィールド定義は次の形式になります。
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を使用して使用可能な値の範囲を指定します。シンボル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文字列は解析されませんが、表のメタデータの一部になります。次に例を示します。
myRec RECORD(a STRING, b INTEGER) COMMENT "Comment string"
または
myInt INTEGER CHECK(myInt > 10 and myInt < 20) COMMENT "Comment string"
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
前述した概念を示すために、次に例を記述します。
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 )