キーは、テーブルの各行を一意に特定します。
テーブルに行を追加する場合、その行には一意のキー値が必要です。行のキー値は、その行が存在する間、一定である必要があります。
AppSheet アプリを使用して行の更新または削除を行う場合、そのキーを使用して更新または削除する行を特定します。
2 つ以上の行に意図せず同じキー値が割り当てられている場合、テーブルに「重複するキー」がある状態になります。これは深刻な問題です。誰かがそのうちの 1 つの行を更新または削除しようとすると、間違った行が更新または削除される可能性があります。
上の図では、メールアドレスがテーブルのキーとして選択されています。この場合、メールアドレスがキーになります。その名前によって各ユーザーを一意に特定できるからです。そのため、キーの重複や、その結果としての問題を回避できます。
以下のセクションでは、キーについてさらに詳しく説明します。
キーの種類
AppSheet は、3 種類のキーをサポートしています。キーの種類は以下のとおりです(好ましい順)。
自然キー
多くのテーブルには、テーブルの各行を一意に特定する単一のフィールドまたはフィールドの組み合わせである、自然キーがあります。
単一列の自然キー
テーブルには、各行を一意に特定する値を含む単一のフィールドがあることが少なくありません。たとえば、Employee
テーブルには特定の従業員 ID を含む EmployeeID
フィールドが含まれているかもしれません。そのようなフィールドが存在する場合、これが理想的なキーとなります。
複数列の自然キー
テーブルには、組み合わせることで各行を一意に特定できる値となる、2 つ以上のフィールドがあるかもしれません。たとえば、Vehicle
テーブルには State
フィールドと LicensePlateNumber
フィールドが含まれていて、これらを組み合わせることで各行を一意に特定できるかもしれません。複数列のキーは単一列のキーと比べて少し扱いにくいものの、キーとして優れています。
計算された自然キー
テーブルには、組み合わせることで一意の計算されたキー値を算出できるフィールドが含まれていることがあります。行の計算されたキー値は、行が存在する間、一定である必要があります。
キーの計算式を、キーフィールドのアプリ数式のプロパティで指定します。
エディタは、時間が経過してもこの式が同じ結果を算出するかどうかを検証し、そうでない場合はエラーを表示します。たとえば、現在の日付や時刻を含むアプリ数式は時間の経過とともに異なる結果を算出する可能性があるため、キーフィールドのアプリ数式で許可されません。
ワークシート数式ではだめなのですか?
スプレッドシートでは、ワークシート数式を使用して計算された ID 列を使用すると便利なことがあります。たとえば、ワークシート数式は前の行の値をインクリメントできます。この方法は、2 つの理由で AppSheet テーブルのキーではうまくいきません。1 つ目に、キーは時間がたっても一意で一定である必要がありますが、ワークシート数式ではこのことを保証できません。2 つ目として、アプリがオフラインで動作している際も数式を計算できる必要がありますが、ワークシート数式ではこれは不可能です。
システム生成キー
一部のテーブルには、自然キーがありません。それで、新しい行に対してシステムに一意のキーを生成させることができます。
Row ID キー
AppSheet のデータベースでは、デフォルトのキーは Row ID です。これは、各行に対して自動的に生成され、「Row ID」列に保存されます。このキーを使用すると、ユーザーはデータベース エディタで参照の作成や管理を行えます。テーブル間の参照を追加するをご覧ください。
Row ID 列は、デフォルトではデータベース エディタに表示されません。データベース エディタで Row ID を表示するには、テーブルに Row ID 列を追加します。
アプリエディタでは別のテーブルキーを選択できますが、そうする前にそのデータベースのテーブルが参照されているかどうかを検討することが重要です。データベースは引き続き Row ID をキーとして使用するため、これらの参照は解除されます。
参照や数式などの機能や、CSV インポート操作の正常な動作を保証するには、既存の参照を新しい列にコピーします。その方法の 1 つは次のとおりです。
- AppSheet のデータベース エディタで、参照しているテーブルの
Reference
列を見つけます。 - 新しい
Lookup
を新しいテーブルキーとなる列に作成し、これまでのReference
列を削除します。 - 新しい
Lookup
列を、Text
などのデータに適した種類に変更します。 - AppSheet のアプリエディタで、テーブルを再生成します。
- 作成したばかりの列の種類を
Ref
に変更して、参照するテーブルを選択します。 - 参照されるテーブルで、新しいキーを選択します。
Row ID ではないキーを選択した後に新しい参照を追加する場合、Google スプレッドシートなどの他のデータソースも下記の手順を実行します。
- AppSheet のデータベース エディタで、データに適した新しい列を作成します。この列を
Reference
列にすべきではありません。 - AppSheet のアプリエディタで、テーブルを再生成して、新しい列を確認します。
- 新しい列の種類を
Ref
に変更して、参照するテーブルを選択します。
シーケンシャル キー
ユーザーが指定した初期値から始まる一意のシーケンシャル キーを AppSheet で生成する方法はありますか、という問い合わせをよく受けます。シーケンシャルであるとは、連続するキーに空白がないことを意味します。たとえば、INV01000
、INV01001
、INV01002
という値はシーケンシャルです。シーケンシャル キーは、レコードの作成日時の順番で発行されるのが理想です。
残念ながら、複数のユーザーがいてオフラインのデータ挿入を許可する分散システムでは、これらの要件をすべて満たす識別子を生成することは技術的に不可能です。生成された値がキー値として使用されるか、通常のフィールド値として使用されるかには関係ありません。
MAX()
式を使用して一意のシーケンシャル キー値を生成することは可能ですが、この方法は単一のユーザーがレコードを追加する場合にのみ正しく機能します。たとえば、MAX(Orders[OrderNumber])+1
という式を使用して、シーケンシャルな OrderNumber
キー値を、Orders
テーブルに生成できます。複数のユーザーがレコードを追加できる状況でこのような式を使用してキー値を生成するのは非常に危険です。計算されたキー値は一意であるとは限らないからです。
ランダムなキー
システムが生成するシーケンシャル キーの代替案の 1 つは、システムが生成するランダムなキーです。
AppSheet は現在、システムが生成するランダムなキーを作成するための 2 つの方法をサポートしています。
UNIQUEID()
関数は、文字と数字を含む、8 文字の一意なテキストを生成します。RANDBETWEEN(lower-bound, upper-bound)
関数は、lower-bound
とupper-bound
の間の疑似ランダムな数値を生成します。
これらの関数は疑似ランダムな値を生成するため、クライアントとサーバー間の調整は必要ありません。オフラインでデータを挿入するユーザーが複数いる場合もうまく動作します。
行番号キー(非推奨)
キーが指定されず、AppSheet が適切なキーを自動で見つけられない場合、AppSheet はデフォルトでワークシートの行番号をキーとして使用します(例: _RowNumber
)。行番号は、良いキーではありません。エントリが移動されるか削除されたり、複数のユーザーが同時にエントリの追加や削除を行うと、各行の行番号が変化し、AppSheet は行を一意に特定できなくなります。行番号がキーとして選択されると、エディタは警告を表示します。
キーを選択する
キーの選択は、自動または手動で行うことができます。
自動のキー選択
新しいテーブルがアプリに追加されると、AppSheet はテーブルに適したキーを見つけようとします。
AppSheet はまずワークシートの各列を左から右に検証していき、一意のデータ値を含む列を探します。ワークシートに適切なキー列がある場合、それをワークシートの一番左の列に配置するとよいでしょう。AppSheet がそのような列を見つけると、その列をキーにします。
Appsheet は次にワークシートの列のペアを見つけるために左から右に検証し、一意のデータ値を含む列のペアを探します。列のペアは隣接する必要はありません。AppSheet がそのような列のペアを見つけると、列を組み合わせて計算されたキーを作成します。計算されたキーは、仮想列としてテーブルの最後に追加されます。
AppSheet がこの方法を使用してキー列を探せなかった場合、デフォルトで行番号をキーとして使用します。行番号がキーとして選択されると、エディタは警告を表示します。
手動のキー選択
次のように、AppSheet のキー選択を手動でオーバーライドできます。
- アプリエディタでアプリを開きます。
- 編集するテーブルの列を表示します。
- 既存のキー列の [Key] プロパティのチェックボックスをオフにします。
- キーにする列の [Key] プロパティのチェックボックスをオンにします。
- アプリでこの列を表示しない場合、この列の [Show?] プロパティの選択を解除します。
- [Edit] をクリックして、列の設定を変更し、[Initial Value] の設定まで下方向にスクロールします。この設定を
UNIQUEID()
に変更して、各行に対して一意のテキストが生成されるようにします。
注: 数値キーにする場合は、RANDBETWEEN()
を使用することもできます。 - 次のいずれかを選択してアプリを保存します。
- Save - アプリを保存します。
- Save & verify data - アプリを保存し、外部依存関係に基づいてアプリが実行可能であるかどうかを確認します。
キーとして使用できない列の種類
以下の列の種類は、テーブルのキーとして使用することはできません。
-
以下を含む、Change 列タイプ。
ChangeCounter
ChangeLocation
ChangeTimestamp
Color
List
Progress
Show