Adobe AIR には、オープンソース SQLite データベースシステムを使用して多くの標準 SQL 機能と共にローカル SQL データベースをサポートする SQL データベースエンジンが含まれています。ランタイムでは、データベースデータがファイルシステムに格納される方法や場所を指定しません。各データベースは、完全に単一ファイル内に格納されます。開発者は、データベースファイルが格納されるファイルシステム内の場所を指定でき、単一の AIR アプリケーションで、1 つまたは多数の異なるデータベース (別々のデータベースファイル) にアクセスできます。
本ドキュメントでは、Adobe AIR ローカル SQL データベースの SQL シンタックスおよびデータ型サポートについて概説します。本ドキュメントは、包括的な SQL リファレンスとして使用されることを目的にはしていません。代わりに、Adobe AIR でサポートされる SQL ダイアレクトの詳細について説明します。ランタイムでは、ほとんどの SQL-92 標準 SQL ダイアレクトがサポートされます。SQL の学習については多数のリファレンス、Web サイト、書籍、およびトレーニング資料があるので、本ドキュメントは、包括的な SQL リファレンスやチュートリアルとして使用されることを目的にはしていません。代わりに、Apollo AIR でサポートされる SQL シンタックス、および SQL-92 とサポートされる SQL ダイアレクト間の違いに焦点を当てます。
次のトピックがあります。
このセクションでは、Adobe AIR SQL データベースエンジンでサポートされる SQL シンタックスについて説明します。これらの一覧は、さまざまなステートメントと句のタイプ、式、ビルトイン関数、および演算子の説明に分かれています。次のトピックがあります。
SELECT、INSERT、UPDATE、および DELETE)CREATE、ALTER、および DROP ステートメント)さまざまなステートメントと式の特定のシンタックスに加えて、SQL シンタックスの一般的な規則を次に示します。
データ操作ステートメントは、最もよく使用される SQL ステートメントです。これらのステートメントは、データベーステーブルのデータを取得、追加、変更、および削除するために使用されます。次のデータ操作ステートメントがサポートされます。
SELECT ステートメントは、データベースのクエリーに使用されます。SELECT の結果はゼロ個以上のデータ行で、各行に固定数の列があります。結果内の列数は、SELECT とオプションの FROM キーワードの間にある result 列名または式リストで指定されます。
任意の式を結果として使用できます。結果の式が * の場合は、すべてのテーブルのすべての列でその 1 つの式が置換されます。式がテーブル名とそれに続く .* である場合、結果は 1 つのテーブル内のすべての列です。
DISTINCT キーワードを使用すると、結果の行のサブセットが返され、各結果行は異なります。NULL 値はそれぞれ異なるものとして扱われません。デフォルトの動作では、すべての結果行が返されます。これはキーワード ALL で明示的に指定できます。
クエリーは、FROM キーワードの後に指定された 1 つ以上のテーブルに対して実行されます。複数のテーブル名がカンマで区切られている場合、クエリーでは各種テーブルのクロス結合が使用されます。JOIN シンタックスを使用してテーブルの結合方法を指定することもできます。サポートされる外部結合のタイプは LEFT OUTER JOIN だけです。join-args の ON 句の式は、ブール値に解決される必要があります。括弧内のサブクエリーは、FROM 句でテーブルとして使用できます。FROM 句全体を省略できます。その場合、結果は result 式リストの値から構成される単一行です。
クエリーで取得する行数を制限するには WHERE 句を使用します。WHERE 句の式は、ブール値に解決される必要があります。WHERE 句のフィルタ処理はグループ化の前に実行されるので、WHERE 句の式に集約関数を含めることはできません。
GROUP BY 句によって、結果の 1 行以上が出力の単一行に結合されます。GROUP BY 句は、結果に集約関数が含まれている場合に特に役立ちます。GROUP BY 句の式は、SELECT 式リストに出現する式である必要はありません。
HAVING 句は、ステートメントによって返される行を制限するという点で WHERE と同様です。ただし、HAVING 句は、GROUP BY 句によって指定されたグループ化が行われた後に適用されます。したがって、HAVING 式は、集約関数を含む値を参照できます。HAVING 句の式は、SELECT リストにある必要はありません。WHERE 式と同様に、HAVING 式はブール値に解決される必要があります。
ORDER BY 句によって、出力行がソートされます。ORDER BY 句への sort-expr-list 引数は、ソートのキーとして使用される式のリストです。式は単純な SELECT の結果の一部である必要はありませんが、複合 SELECT (compound-op 演算子の 1 つを使用した SELECT) では、各ソート式が結果列の 1 つと完全に一致する必要があります。オプションとして、各ソート式の後に、テキストの並べ替えに使用される COLLATE キーワードと照合関数名や、ソート順を指定するキーワード ASC または DESC から構成される sort-order 句を指定できます。sort-order は省略可能で、その場合はデフォルト (昇順) が使用されます。COLLATE 句と照合関数の定義については、「COLLATE」を参照してください。
LIMIT 句は、結果で返される行数の上限を設定します。負の LIMIT は上限がないことを示します。LIMIT に続くオプションの OFFSET では、結果セットの先頭でスキップする行数を指定します。複合 SELECT クエリーでは、LIMIT 句は最後の SELECT ステートメントの後にのみ指定でき、制限はクエリー全体に適用されます。LIMIT 句で OFFSET キーワードが使用されている場合、制限は最初の整数で、オフセットは 2 番目の整数です。OFFSET キーワードの代わりにカンマが使用されている場合、オフセットは最初の数値で、制限は 2 番目の数値です。この一見矛盾する定義は意図的です。これにより、古い SQL データベースシステムとの互換性が最大化されます。
複合 SELECT は、演算子 UNION、UNION ALL、INTERSECT、EXCEPT のいずれかによって接続された複数の単純な SELECT ステートメントから構成されます。複合 SELECT では、構成要素であるすべての SELECT ステートメントで同じ結果列数を指定する必要があります。最後の SELECT ステートメントの後 (また、単一の LIMIT 句が指定されている場合はその前) には、単一の ORDER BY 句のみ指定できます。UNION 演算子と UNION ALL 演算子では、先行および後続の SELECT ステートメントの結果が単一のテーブルに結合されます。違いは、UNION ではすべての結果行が異なり、UNION ALL では重複する可能性があることです。INTERSECT 演算子は、先行および後続の SELECT ステートメントの結果の交差領域を取得します。EXCEPT は、後続の SELECT の結果を削除した後で、先行する SELECT の結果を取得します。3 つ以上の SELECT ステートメントが複合に接続されている場合は、最初から最後までグループ化されます。
使用できる式の定義については、「式」を参照してください。
INSERT ステートメントには 2 つの基本形式があり、テーブルにデータを設定するために使用されます。
最初の形式 (VALUES キーワードあり) では、既存のテーブルに単一の新しい行が作成されます。column-list が指定されていない場合は、値の数がテーブルの列数と同じである必要があります。column-list が指定されている場合、値の数は指定された列の数と一致する必要があります。列リストにないテーブルの列には、テーブルの作成時に定義されたデフォルト値が設定され、デフォルト値が定義されていない場合は NULL が設定されます。
INSERT ステートメントの 2 番目の形式では、SELECT ステートメントからデータが取得されます。SELECT の結果内の列数は、column-list が指定されていない場合にはテーブル内の列数と完全に一致する必要があります。または、column-list で指定された列の数と一致する必要があります。SELECT の結果の各行に対して新しいエントリがテーブルに作成されます。SELECT は単純または複合にすることができます。使用できる SELECT ステートメントの定義については、「SELECT」を参照してください。
オプションの conflict-algorithm では、この 1 つのコマンド中に使用する代替の制約競合解決アルゴリズムを指定できます。競合アルゴリズムの説明と定義については、「ON CONFLICT (競合アルゴリズム)」を参照してください。
ステートメントの 2 つの REPLACE INTO 形式は、標準の INSERT [OR conflict-algorithm] 形式を REPLACE 競合アルゴリズムと共に使用する場合 (つまり、INSERT OR REPLACE... 形式) と同じです。
UPDATE ステートメントは、テーブル内の行のセットの列値を変更するために使用します。
UPDATE 内の各代入では、等号の左辺に列名を指定し、右辺に任意の式を指定します。式では、他の列の値を使用できます。代入が行われる前にすべての式が評価されます。使用できる式の定義については、「式」を参照してください。
更新される行を制限するには WHERE 句を使用します。WHERE 句の式は、ブール値に解決される必要があります。
オプションの conflict-algorithm では、この 1 つのコマンド中に使用する代替の制約競合解決アルゴリズムを指定できます。競合アルゴリズムの説明と定義については、「ON CONFLICT (競合アルゴリズム)」を参照してください。
DELETE コマンドは、テーブルからレコードを削除するために使用します。
コマンドは、DELETE FROM キーワードに続いて、レコードを削除するテーブル名から構成されます。
WHERE 句がない場合は、テーブルのすべての行が削除されます。WHERE 句が指定されている場合は、式に一致する行のみ削除されます。WHERE 句の式は、ブール値に解決される必要があります。使用できる式の定義については、「式」を参照してください。
データ定義ステートメントは、テーブル、ビュー、インデックス、トリガなどのデータベースオブジェクトを作成、変更、および削除するために使用されます。次のデータ定義ステートメントがサポートされます。
CREATE TABLE ステートメントは、キーワード CREATE TABLE と、それに続く新規テーブル名、さらに列定義と制約のリスト (括弧内) から構成されます。テーブル名は、識別子またはストリングのいずれかです。
各列定義は、列の名前と、それに続くその列のデータ型、さらに 1 つ以上のオプションの列制約です。列のデータ型は、その列に格納できるデータを制限します。異なるデータ型の列に値を格納しようとすると、可能な場合にはランタイムによって値が適切な型に変換され、可能でない場合にはエラーが発生します。追加情報については、「データ型のサポート」を参照してください。
NOT NULL 列制約は、列に NULL 値を含めることができないことを指定します。
UNIQUE 制約を指定すると、指定された 1 つまたは複数の列にインデックスが作成されます。このインデックスには、一意キーが含まれている必要があります。2 つの行に、重複する値や、指定された 1 つまたは複数の列の値の組み合わせを含めることはできません。CREATE TABLE ステートメントには、複数の UNIQUE 制約を指定できます。これには、列の定義内に UNIQUE 制約がある複数の列や、複数のテーブルレベル UNIQUE 制約が含まれます。
CHECK 制約は評価される式を定義し、行のデータが挿入または更新されるためには true である必要があります。CHECK 式は、ブール値に解決される必要があります。
列定義内の COLLATE 句は、列のテキストエントリを比較するときに使用するテキスト照合関数を指定します。BINARY 照合関数がデフォルトで使用されます。COLLATE 句と照合関数の詳細については、「COLLATE」を参照してください。
DEFAULT 制約は、INSERT を実行するときに使用するデフォルト値を指定します。値は、NULL、ストリング定数、または数値にすることができます。デフォルト値は、特殊なケースに依存しないキーワード CURRENT_TIME、CURRENT_DATE、CURRENT_TIMESTAMP のいずれかにすることもできます。値が NULL、ストリング定数、または数値の場合は、INSERT ステートメントで列の値が指定されていない場合に、これらがそのまま列に挿入されます。値が CURRENT_TIME、CURRENT_DATE、または CURRENT_TIMESTAMP の場合は、現在の UTC 日付と時刻、あるいはその両方が列に挿入されます。CURRENT_TIME の場合、形式は HH:MM:SS です。CURRENT_DATE の場合、形式は YYYY-MM-DD です。CURRENT_TIMESTAMP の形式は YYYY-MM-DD HH:MM:SS です。
PRIMARY KEY を指定すると、通常は対応する 1 つまたは複数の列に UNIQUE インデックスが作成されます。ただし、データ型 INTEGER の単一列に対して PRIMARY KEY 制約がある場合、その列は、テーブルの実際の主キーとして内部的に使用されます。したがって、列は一意の整数値のみ保持できます。テーブルに INTEGER PRIMARY KEY 列がない場合は、行の挿入時に整数キーが自動的に生成されます。行の主キーは、特殊な名前 ROWID、OID、_ROWID_ のいずれかを使用していつでもアクセスできます。これらの名前は、INTEGER PRIMARY KEY で明示的に宣言されているか、内部的に生成された値であるかに関係なく使用できます。INTEGER PRIMARY KEY 列には、キーワード AUTOINCREMENT を含めることもできます。AUTOINCREMENT キーワードが使用される場合、データベースは、INSERT ステートメントの実行時に、順番にインクリメントされる整数キーを自動的に生成して INTEGER PRIMARY KEY 列に挿入します。
CREATE TABLE ステートメントには PRIMARY KEY 制約を 1 つだけ含めることができます。これは、ある列の定義の一部または単一のテーブルレベル PRIMARY KEY 制約にすることができます。主キー列は暗黙の NOT NULL です。
多くの制約に続くオプションの conflict-clause では、その制約に対する代替のデフォルト制約競合解決アルゴリズムを指定できます。デフォルトは ABORT です。同じテーブル内の異なる制約が、異なるデフォルトの競合解決アルゴリズムを持つことができます。INSERT または UPDATE ステートメントで異なる競合解決アルゴリズムが指定されている場合は、そのアルゴリズムが、CREATE TABLE ステートメントで指定されたアルゴリズムの代わりに使用されます。追加情報については、「ON CONFLICT (競合アルゴリズム)」を参照してください。
FOREIGN KEY 制約などの追加の制約を指定してもエラーにはなりませんが、実行時に無視されます。
TEMP または TEMPORARY キーワードが CREATE と TABLE の間にある場合、作成されるテーブルは、同じデータベース接続 (SQLConnection インスタンス) 内でのみ参照できます。データベース接続が終了すると、自動的に削除されます。一時テーブルに作成されたインデックスも一時的です。一時テーブルおよびインデックスは、メインデータベースファイルとは別のファイルに格納されます。
オプションの database-name 接頭辞が指定されている場合は、指定されたデータベース (指定されたデータベース名で attach() メソッドを呼び出すことにより SQLConnection インスタンスに接続されたデータベース) にテーブルが作成されます。database-name 接頭辞が temp でない限り、database-name 接頭辞と TEMP キーワードの両方を指定することは誤りです。データベース名が指定されておらず、TEMP キーワードが存在しない場合は、メインデータベース (open() または openAsync() メソッドを使用して SQLConnection インスタンスに接続されたデータベース) にテーブルが作成されます。
列数またはテーブル内の制約数に任意の制限はありません。1 行のデータ量にも任意の制限はありません。
CREATE TABLE AS 形式は、テーブルをクエリーの結果セットとして定義します。テーブル列の名前は、結果内の列の名前です。
オプションの IF NOT EXISTS 句があり、同じ名前の別のテーブルが既に存在する場合、データベースは CREATE TABLE コマンドを無視します。
テーブルは、DROP TABLE ステートメントを使用して削除でき、ALTER TABLE ステートメントを使用して限られた変更を加えることができます。
ALTER TABLE コマンドを使用すると、ユーザーは新しい列を名前変更または既存のテーブルに追加できます。テーブルから列を削除することはできません。
RENAME TO シンタックスは、[database-name.] table-name で識別されているテーブルの名前を new-table-name に変更するために使用します。このコマンドを使用して、アタッチされているデータベース間でテーブルを移動することはできません。同じデータベース内でテーブル名を変更することのみ可能です。
名前変更されるテーブルにトリガまたはインデックスがある場合、それらはテーブル名が変更された後もテーブルにアタッチされたままになります。ただし、名前変更されるテーブルを参照するトリガによって実行されたビュー定義またはステートメントがある場合は、新しいテーブル名を使用するように自動的に変更されることはありません。名前変更されたテーブルにビューまたはトリガが関連付けられている場合は、新しいテーブル名を使用してトリガまたはビュー定義を手動で削除し、再作成する必要があります。
ADD [COLUMN] シンタックスは、新しい列を既存のテーブルに追加するために使用します。新しい列は常に既存の列のリストの最後に追加されます。column-def 句は、CREATE TABLE ステートメントで許可される形式のいずれにすることもできますが、次の制限があります。
PRIMARY KEY または UNIQUE 制約を指定することはできません。CURRENT_TIME、CURRENT_DATE、または CURRENT_TIMESTAMP のデフォルト値を指定することはできません。NOT NULL 制約が指定されている場合、列には NULL 以外のデフォルト値が必要です。ALTER TABLE ステートメントの実行時間は、テーブル内のデータ量の影響を受けません。
DROP TABLE ステートメントは、CREATE TABLE ステートメントで追加されたテーブルを削除します。table-name が指定されているテーブルは削除されるテーブルです。データベースとディスクファイルから完全に削除されます。テーブルを復元することはできません。テーブルに関連付けられているインデックスもすべて削除されます。
デフォルトでは、DROP TABLE ステートメントはデータベースファイルのサイズを削減しません。データベース内の空の領域は保持され、後続の INSERT 操作で使用されます。データベース内の空き領域を削除するには、SQLConnection.clean() メソッドを使用します。データベースが最初に作成されたときに autoClean パラメータが true に設定された場合は、領域が自動的に解放されます。
オプションの IF EXISTS 句は、テーブルが存在しない場合に通常発生するエラーを抑制します。
CREATE INDEX コマンドは、キーワード CREATE INDEX と、それに続く新規インデックスの名前、キーワード ON、以前に作成された、インデックス作成対象のテーブル名、および値がインデックス キーに使用されるテーブル内の列名を括弧で囲んだリストから構成されます。
各列名の後に、ソート順を指定する ASC または DESC キーワードを続けることができますが、ソート順の指定は実行時に無視されます。ソートは常に昇順で行われます。
各列名に続く COLLATE 句は、その列のテキスト値に使用される照合シーケンスを定義します。デフォルトの照合シーケンスは、CREATE TABLE ステートメントでその列に対して定義された照合シーケンスです。照合シーケンスを指定しない場合は、BINARY 照合シーケンスが使用されます。COLLATE 句と照合関数の定義については、「COLLATE」を参照してください。
1 つのテーブルにアタッチできるインデックス数に任意の制限はありません。インデックス内の列数にも制限はありません。
DROP INDEX ステートメントは、CREATE INDEX ステートメントで追加されたインデックスを削除します。指定されたインデックスは、データベースファイルから完全に削除されます。インデックスを復元する唯一の方法は、適切な CREATE INDEX コマンドを再入力することです。
デフォルトでは、DROP INDEX ステートメントはデータベースファイルのサイズを削減しません。データベース内の空の領域は保持され、後続の INSERT 操作で使用されます。データベース内の空き領域を削除するには、SQLConnection.clean() メソッドを使用します。データベースが最初に作成されたときに autoClean パラメータが true に設定された場合は、領域が自動的に解放されます。
CREATE VIEW コマンドは、定義済み SELECT ステートメントに名前を割り当てます。この新しい名前は、別の SELECT ステートメントの FROM 句でテーブル名の代わりに使用できます。通常、ビューは、複雑な (および最近使用された) データのセットを他の操作で使用できる構造に結合することで、クエリーを単純化するために使用されます。
TEMP または TEMPORARY キーワードが CREATE と VIEW の間にある場合、作成されるビューは、データベースを開いた SQLConnection インスタンスからのみ参照でき、データベースが閉じられると自動的に削除されます。
[database-name] が指定されている場合は、指定されたデータベース (name 引数を指定した attach() メソッドを使用して SQLConnection インスタンスに接続されたデータベース) にビューが作成されます。[database-name] 接頭辞が temp でない限り、[database-name] と TEMP キーワードの両方を指定することは誤りです。データベース名が指定されておらず、TEMP キーワードが存在しない場合は、メインデータベース (open() または openAsync() メソッドを使用して SQLConnection インスタンスに接続されたデータベース) にビューが作成されます。
ビューは読み取り専用です。関連付けられているタイプのトリガ (INSTEAD OF DELETE、INSTEAD OF INSERT、INSTEAD OF UPDATE) が少なくとも 1 つ定義されていない限り、DELETE、INSERT、または UPDATE ステートメントをビューに対して使用することはできません。ビューのトリガの作成については、「CREATE TRIGGER」を参照してください。
ビューは、DROP VIEW ステートメントを使用してデータベースから削除されます。
DROP VIEW ステートメントは、CREATE VIEW ステートメントで作成されたビューを削除します。
指定された view-name は削除するビューの名前です。データベースからは削除されますが、基礎となるテーブル内のデータは変更されません。
CREATE TRIGGER ステートメントは、データベーススキーマにトリガを追加するために使用されます。トリガは、指定されたデータベースイベント (database-event) が発生したときに自動的に実行されるデータベース操作 (trigger-action) です。
トリガは、特定のデータベーステーブルの DELETE、INSERT、または UPDATE が実行されるたび、あるいは 1 つ以上の指定されたテーブル列の UPDATE が更新されるたびに起動するように指定されます。トリガは、TEMP または TEMPORARY キーワードが使用されていない限り永続的です。その場合、トリガは、SQLConnection インスタンスのメインデータベース接続が終了すると削除されます。タイミング (BEFORE または AFTER) が指定されていない場合、トリガはデフォルトで BEFORE になります。
FOR EACH ROW トリガのみサポートされるため、FOR EACH ROW テキストはオプションです。FOR EACH ROW トリガでは、WHEN 句の式が true に評価される場合に、トリガが起動する原因となったステートメントによって挿入、更新、または削除される各データベース行に対して trigger-step ステートメントが実行されます。
WHEN 句が指定されている場合、トリガステップとして指定された SQL ステートメントは、WHEN 句が true である行に対してのみ実行されます。WHEN 句が指定されていない場合、SQL ステートメントはすべての行に対して実行されます。
トリガの本文内で (trigger-action 句)、特別なテーブル名 OLD および NEW を使用して、影響を受けるテーブルの変更前および変更後の値を使用できます。OLD および NEW テーブルの構造は、トリガが作成されるテーブルの構造と一致します。OLD テーブルには、トリガステートメントによって変更または削除された行が、トリガステートメントの操作の前の状態で含まれます。NEW テーブルには、トリガステートメントによって変更または作成された行が、トリガステートメントの操作の後の状態で含まれます。WHEN 句と trigger-step ステートメントは、どちらも NEW.column-name および OLD.column-name 形式の参照を使用して挿入、削除、または更新される行の値にアクセスできます。column-name は、トリガが関連付けられているテーブルの列名です。OLD および NEW テーブル参照の可用性は、トリガが処理する database-event のタイプによって決まります。
INSERT – NEW 参照が有効です。UPDATE – NEW および OLD 参照が有効です。DELETE – OLD 参照が有効です。指定されたタイミング (BEFORE、AFTER、または INSTEAD OF) は、関連付けられている行の挿入、変更、または削除との相対で、trigger-step ステートメントがいつ実行されるかを判断します。ON CONFLICT 句は、trigger-step の UPDATE または INSERT ステートメントの一部として指定できます。ただし、トリガが起動する原因となったステートメントの一部として ON CONFLICT 句が指定されている場合は、その競合処理ポリシーが代わりに使用されます。
テーブルトリガに加えて、INSTEAD OF トリガをビューに作成できます。1 つ以上の INSTEAD OF INSERT、INSTEAD OF DELETE、または INSTEAD OF UPDATE トリガがビューに定義されている場合は、エラーと見なされず、ビューに対して関連するタイプのステートメント (INSERT、DELETE、または UPDATE) が実行されます。その場合は、ビューに対して INSERT、DELETE、または UPDATE を実行すると、関連付けられているトリガが起動します。トリガは INSTEAD OF トリガなので、ビューの基礎となるテーブルは、トリガが起動する原因となったステートメントによって変更されません。ただし、トリガは、基礎となるテーブルに対して変更操作を実行するために使用できます。
INTEGER PRIMARY KEY 列があるテーブルに対してトリガを作成する場合に、考慮する必要のある重要な問題があります。トリガが起動する原因となったステートメントによって更新される行の INTEGER PRIMARY KEY 列が BEFORE トリガによって変更された場合は、更新が行われません。回避方法は、INTEGER PRIMARY KEY 列ではなく PRIMARY KEY 列のあるテーブルを作成することです。
トリガは、DROP TRIGGER ステートメントを使用して削除できます。テーブルまたはビューが削除された場合、そのテーブルまたはビューに関連付けられているすべてのトリガも自動的に削除されます。
特殊な SQL 関数 RAISE() は、トリガの trigger-step ステートメントで使用できます。この関数のシンタックスは次のとおりです。
最初の 3 つの形式の 1 つがトリガの実行中に呼び出されると、指定された ON CONFLICT 処理アクション (ABORT、FAIL、または ROLLBACK) が実行され、現在のステートメントの実行が終了します。ROLLBACK はステートメントの実行エラーと見なされるため、execute() メソッドが実行された SQLStatement インスタンスによって error (SQLErrorEvent.ERROR) イベントがディスパッチされます。ディスパッチされたイベントオブジェクトの error プロパティ内の SQLError オブジェクトの details プロパティは、RAISE() 関数で指定された error-message に設定されています。
RAISE(IGNORE) が呼び出されると、現在のトリガの残りの部分、トリガが実行される原因となったステートメント、および実行される後続のトリガが中止されます。データベース変更はロールバックされません。トリガが実行される原因となったステートメントがトリガの一部である場合、そのトリガプログラムは次のステップの先頭で実行を再開します。競合解決アルゴリズムの詳細については、「ON CONFLICT (競合アルゴリズム)」を参照してください。
DROP TRIGGER ステートメントは、CREATE TRIGGER ステートメントで作成されたトリガを削除します。
トリガはデータベースから削除されます。トリガは、関連付けられているテーブルが削除されると自動的に削除されます。
このセクションでは、実行時に提供される SQL への拡張であるいくつかの句と、多くのステートメント、コメント、および式で使用できる 2 つの言語要素について説明します。このセクションの要素は次のとおりです。
COLLATE 句は、値を比較またはソートするときに使用される比較アルゴリズムを指定するために SELECT、CREATE TABLE、および CREATE INDEX ステートメントで使用されます。
列のデフォルトの照合タイプは BINARY です。BINARY 照合が TEXT 記憶クラスの値で使用されている場合、BINARY 照合は、テキストエンコードを考慮せずに、値を表すメモリのバイト値を比較することによって実行されます。
NOCASE 照合シーケンスは TEXT 記憶クラスの値に対してのみ適用されます。NOCASE 照合を使用すると、大文字と小文字を区別せずに比較されます。
NULL、BLOB、INTEGER、REAL 型の記憶クラスでは、照合シーケンスは使用されません。
BINARY 以外の照合タイプを列で使用するには、CREATE TABLE ステートメントの列定義の一部として COLLATE 句を指定する必要があります。2 つの TEXT 値を比較するときは、常に照合シーケンスを使用し、次の規則に従って比較結果が決定されます。
=、<、>、<=、および >=) では、一方のオペランドが列である場合、その列のデフォルトの照合タイプによって、比較で使用される照合シーケンスが決まります。両方のオペランドが列である場合は、左のオペランドの照合タイプによって、使用される照合シーケンスが決まります。どちらのオペランドも列でない場合は、BINARY 照合シーケンスが使用されます。BETWEEN...AND 演算子は、2 つの式に対して >= 演算子と <= 演算子を使用するのと同じです。たとえば、x BETWEEN y AND z という式は x >= y AND x <= z と同じです。したがって、BETWEEN...AND 演算子も上記の規則に従って照合シーケンスが決定されます。IN 演算子は、使用する照合シーケンスを決定するという点では、= 演算子と同じように動作します。たとえば、x IN (y, z) という式で使用される照合シーケンスは、x が列の場合は x のデフォルトの照合タイプになります。それ以外の場合は、BINARY 照合が使用されます。SELECT ステートメントでは、ORDER BY 句の中で、ソート操作で使用する照合シーケンスを明示的に指定できます。その場合は、明示的に指定した照合シーケンスが常に使用されます。それ以外の場合は、ORDER BY 句によってソートされる式が列の場合には、その列のデフォルトの照合タイプを使用してソート順が決定されます。式が列でない場合は、BINARY 照合シーケンスが使用されます。EXPLAIN コマンド修飾子は、SQL の非標準の拡張機能です。
SQL ステートメントの前に EXPLAIN キーワードを付けると、コマンドを実際に実行する代わりに、EXPLAIN キーワードを指定せずにコマンドを実行した場合に使用される一連の仮想マシン命令が報告されます。この高度な EXPLAIN 機能を使用すると、SQL ステートメントのテキストを調整してパフォーマンスを最適化したり、適切に機能しない SQL ステートメントをデバッグしたりできます。
ON CONFLICT 句は独立した SQL コマンドではありません。これは他の多くの SQL コマンドで使用できる非標準の句です。
最初の形式の、キーワード ON CONFLICT を使用する ON CONFLICT 句は、CREATE TABLE ステートメントで使用します。INSERT ステートメントまたは UPDATE ステートメントでは、シンタックスがより自然に見えるように、ON CONFLICT が OR に置き換えられた 2 番目の形式を使用します。たとえば、ステートメントは INSERT ON CONFLICT IGNORE ではなく、INSERT OR IGNORE になります。キーワードは異なりますが、句の意味はどちらの形式でも同じです。
ON CONFLICT 句は、制約競合の解決に使用するアルゴリズムを指定します。指定できるアルゴリズムは、ROLLBACK、ABORT、FAIL、IGNORE、REPLACE の 5 種類です。デフォルトのアルゴリズムは ABORT です。これら 5 種類の競合アルゴリズムについて以下に説明します。
ROLLBACK が実行され、現在のトランザクションが終了します。コマンドは中止され、SQLStatement インスタンスによって error イベントが送出されます。トランザクションがアクティブでない場合 (すべてのコマンドについて作成される暗黙的なトランザクションを除く)、このアルゴリズムは ABORT と同様に動作します。error イベントが送出されます。ROLLBACK は実行されないので、トランザクション内の前のコマンドで行われた変更はそのまま残ります。ABORT はデフォルトの動作です。error イベントが送出されます。ただし、制約違反が発生する前にそのステートメントによってデータベースに加えられた変更は取り消されずにそのまま残ります。たとえば、UPDATE ステートメントの実行時に更新対象の 100 行目で制約違反が発生した場合、それまでの 99 行の変更はそのまま残りますが、100 行目以降の変更は行われません。UNIQUE 制約違反が発生すると、制約違反の原因となる既存の行が削除された後で、現在の行が挿入または更新されます。したがって、挿入または更新は常に実行され、コマンドは通常どおり続行されます。エラーは返されません。NOT NULL 制約違反が発生した場合は、NULL 値がその列のデフォルト値で置き換えられます。列にデフォルト値がない場合は、ABORT アルゴリズムが使用されます。CHECK 制約違反が発生した場合は、IGNORE アルゴリズムが使用されます。この競合解決方法により、制約を満たすために行が削除されたときは、それらの行に対する削除トリガは呼び出されません。INSERT ステートメントまたは UPDATE ステートメントの OR 句で指定されたアルゴリズムは、CREATE TABLE ステートメントで指定されたアルゴリズムよりも優先されます。CREATE TABLE ステートメントおよび実行中の INSERT ステートメントまたは UPDATE ステートメントのどちらでもアルゴリズムが指定されていない場合は、ABORT アルゴリズムが使用されます。
REINDEX コマンドは、1 つ以上のインデックスを削除して再作成するときに使用します。このコマンドは、照合シーケンスの定義が変更されたときに便利です。
最初の形式では、アタッチされたデータベース内の指定された照合シーケンスを使用するすべてのインデックスが再作成されます。2 番目の形式では、table-name を指定した場合、そのテーブルに関連付けられたすべてのインデックスが再構築されます。index-name を指定した場合は、指定したインデックスのみが削除され、再作成されます。
コメントは SQL コマンドではありませんが、SQL クエリの中に記述できます。コメントはランタイムでは空白として扱われます。コメントは、空白が許可される任意の場所 (複数行にわたる式の内部など) に記述できます。
単一行のコメントには 2 つのダッシュを使用します。単一行コメントでは、その行の末尾までがコメントになります。
ブロックコメントは、任意の行数にわたることも、単一行に埋め込むこともできます。ブロックコメントの終わりを示す区切り記号がない場合は、入力の最後までがブロックコメントになります。これはエラーとして扱われません。新しい SQL ステートメントは、ブロックコメントが終了した後の行から開始できます。ブロックコメントは、空白が許可される任意の場所 (式の内部など) のほか、他の SQL ステートメントの中にも埋め込むことができます。ブロックコメントはネストされません。ブロックコメントの中に単一行コメントを記述しても無視されます。
式は他の SQL ブロック内のサブコマンドです。SQL ステートメントで使用する式の有効なシンタックスを次に示します。
式とは、単一の値に解決できる値と演算子の任意の組み合わせを指します。式は、ブール値 (true または false) に解決できるか、または非ブール値に解決できるかによって、2 つの一般的な種類に分けられます。
WHERE 句、HAVING 句、JOIN 句の中の ON 式、CHECK 式などのいくつかの一般的な状況で使用する式は、ブール値に解決する必要があります。この条件を満たす式の種類は次のとおりです。
リテラルの数値は、整数または浮動小数点数として記述します。科学的表記法もサポートされます。小数点には常に . (ピリオド) を使用します。
ストリングリテラルを示すときは、ストリングを一重引用符 (') で囲みます。ストリングの中に一重引用符を含めるには、'' のように一重引用符を行で 2 つ重ねます。
ブールリテラルの値は true または false で示します。リテラルブール値は、列のデータ型が Boolean の場合に使用します。
BLOB リテラルは 16 進数データを含むストリングリテラルで、1 つの x または X を先頭に付けます (X'53514697465' など)。
リテラル値にはトークン NULL も使用できます。
列名には、CREATE TABLE ステートメントで定義されたいずれかの名前、または特殊識別子の ROWID、OID、_ROWID_ のいずれかを使用できます。これらの特殊識別子はすべて、各テーブルのすべての行に関連付けられた一意のランダムな整数キー ("行キー") を表します。特殊識別子は、CREATE TABLE ステートメントで同じ名前を持つ実際の列が定義されていない場合のみ、行キーを参照します。行キーは読み取り専用列のように動作します。行キーは通常の列が使用できる場所であればどこでも使用できますが、行キーの値を UPDATE ステートメントまたは INSERT ステートメントで変更することはできません。SELECT * FROM table ステートメントで返される結果セットには、行キーは含まれません。
IN 演算子の右オペランド、スカラ量 (単一の結果値)、または EXISTS 演算子のオペランドとして式を使用するときは、SELECT ステートメントを使用できます。スカラ量または IN 演算子のオペランドとして使用する場合、SELECT ステートメントで返すことができるのは 1 つの列のみです。(UNION や EXCEPT などのキーワードで接続された) 複合 SELECT ステートメントも使用できます。EXISTS 演算子では、SELECT ステートメントの結果セットに含まれる列は無視され、行が 1 行以上存在する場合は TRUE、結果セットが空の場合は FALSE が返されます。SELECT 式のどの項も外側のクエリの値を参照しない場合、式は他の処理が実行される前に 1 回だけ評価され、その結果が必要に応じて再利用されます。SELECT 式に外部クエリからの変数が含まれる場合 (これを相関サブクエリと呼びます)、SELECT ステートメントは必要になるたびに再評価されます。
SELECT ステートメントが IN 演算子の右オペランドである場合、IN 演算子は、左オペランドの結果が SELECT ステートメントの結果セットに含まれるいずれかの値と等しい場合に TRUE を返します。IN 演算子の前に NOT キーワードを付けると、テストの意味が逆になります。
IN 演算子の右オペランド以外の式で SELECT ステートメントを使用する場合は、SELECT ステートメントの結果の 1 行目が値として使用されます。SELECT ステートメントが複数行の結果を返す場合、2 行目以降の行はすべて無視されます。SELECT ステートメントが行を 1 行も返さない場合、SELECT ステートメントの値は NULL になります。
CAST 式は、指定された値のデータ型を別の指定されたデータ型に変更します。指定できるデータ型は、CREATE TABLE ステートメントの列定義でデータ型として使用できる空でない型名です。詳細については、「データ型のサポート」を参照してください。
以降の節では、式で使用できるその他の SQL エレメントについて説明します。
ビルトイン関数は次の 3 種類に大別されます。
これらの関数に加えて、特殊関数の RAISE() もあります。この関数は、トリガの実行時にエラーを通知するために使用します。この関数は、CREATE TRIGGER ステートメントの本体でのみ使用できます。RAISE() 関数の詳細については、「CREATE TRIGGER」の「RAISE()」を参照してください。
SQL のすべてのキーワードと同様に、関数名も大文字と小文字は区別されません。
集計関数は、複数行の値に対して演算を実行します。これらは主に SELECT ステートメントの中で GROUP BY 句と一緒に使用します。
AVG(X) |
グループ内の NULL でないすべての X の平均値を返します。数値に見えないストリング値および BLOB 値は 0 と見なされます。AVG() の結果は、入力がすべて整数であっても、常に浮動小数点値です。 |
|
最初の形式は、グループ内で X が NULL でない回数を返します。* 引数の付いた 2 番目の形式は、グループ内の行の総数を返します。 |
MAX(X) |
グループ内のすべての値の最大値を返します。通常のソート順を使用して最大値が決定されます。 |
MIN(X) |
グループ内のすべての値のうち NULL でない最小の値を返します。通常のソート順を使用して最小値が決定されます。グループ内の値がすべて NULL の場合は、NULL が返されます。 |
|
グループ内の NULL でないすべての値の合計を返します。値がすべて NULL の場合には、SUM() は NULL を返し、TOTAL() は 0.0 を返します。TOTAL() の結果は常に浮動小数点値です。SUM() の結果は、NULL 以外の入力がすべて整数の場合は整数値になります。SUM() への入力に整数でも NULL でもない値が含まれている場合、SUM() は浮動小数点値を返しますが、この値は正確な合計の近似値である場合があります。 |
上記の集計関数のうち引数を 1 つ受け取るものはいずれも、その引数の前にキーワード DISTINCT を付けることができます。その場合は、重複したエレメントが除外されてから集計関数に渡されます。たとえば、関数が COUNT(DISTINCT x) を呼び出すと、列 x の NULL でない値の総数ではなく、列 X の互いに異なる値の数が返されます。
スカラ関数は一度に 1 つの行の値に作用します。スカラ関数の一覧を次に示します。
ABS(X) |
引数 X の絶対値を返します。 |
COALESCE(X, Y, ...) |
NULL でない最初の引数のコピーを返します。引数がすべて NULL の場合は、NULL が返されます。引数は 2 つ以上指定する必要があります。 |
GLOB(X, Y) |
この関数は、X GLOB Y シンタックスを実装するために使用されます。 |
IFNULL(X, Y) |
NULL でない最初の引数のコピーを返します。引数がどちらも NULL の場合は、NULL が返されます。この関数の動作は COALESCE() と同じです。 |
HEX(X) |
引数は BLOB 格納型の値と解釈されます。その値の内容の 16 進数表現が返されます。 |
LAST_INSERT_ROWID() |
現在の SQLConnection を通じてデータベースに最後に挿入された行の行識別子 (生成された主キー) を返します。これは SQLConnection.lastInsertRowID プロパティで返される値と同じです。 |
LENGTH(X) |
X のストリングの長さ (文字数) を返します。 |
LIKE(X, Y [, Z]) |
この関数は、SQL の X LIKE Y [ESCAPE Z] シンタックスを実装するために使用されます。オプションの ESCAPE 句を指定すると、3 つの引数を使用して関数が呼び出されます。それ以外の場合は、2 つの引数のみを使用して関数が呼び出されます。 |
LOWER(X) |
ストリング X の、すべての文字が小文字に変換されたコピーを返します。 |
|
X の左側からスペースを除去したストリングを返します。Y 引数を指定すると、Y に含まれるいずれかの文字が X の左側から除去されます。 |
MAX(X, Y, ...) |
引数の中の最大値を返します。引数には、数字だけでなくストリングも指定できます。最大値は、定義されたソート順に従って決定されます。MAX() は、引数が 2 個以上ある場合は単純な関数ですが、引数が 1 つだけの場合は集計関数になります。 |
MIN(X, Y, ...) |
引数の中の最小値を返します。引数には、数字だけでなくストリングも指定できます。最小値は、定義されたソート順に従って決定されます。MIN() は、引数が 2 個以上ある場合は単純な関数ですが、引数が 1 つだけの場合は集計関数になります。 |
NULLIF(X, Y) |
引数が異なる場合は最初の引数を返し、それ以外の場合は NULL を返します。 |
QUOTE(X) |
このルーチンは、引数の値を別の SQL ステートメントに挿入するのに適した形に変更したストリングを返します。ストリングは一重引用符で囲まれ、必要に応じて内部引用符がエスケープされます。BLOB 記憶クラスは 16 進数のリテラルとしてエンコードされます。この関数は、トリガを記述して元に戻す/繰り返し機能を実装する場合に役立ちます。 |
RANDOM(*) |
-9223372036854775808 から 9223372036854775807 までの疑似乱数 (整数) を返します。これは暗号的に強い乱数ではありません。 |
RANDOMBLOB(N) |
疑似乱数バイトを含む N バイトの BLOB を返します。N は正の整数である必要があります。これは暗号的に強いランダム値ではありません。N の値が負の場合は、単一のバイトが返されます。 |
|
数値 X を小数第 Y 位に四捨五入します。Y 引数を省略すると、0 が使用されます。 |
|
X の右側からスペースを除去したストリングを返します。Y 引数を指定すると、Y に含まれるいずれかの文字が X の右側から除去されます。 |
SUBSTR(X, Y, Z) |
入力ストリング X の Y 番目の文字から Z 個の文字を取り出したサブストリングを返します。X の一番左の文字のインデックス位置は 1 です。Y が負の場合は、サブストリングの開始位置が左からではなく右からカウントされます。 |
|
X の左右両側からスペースを除去したストリングを返します。Y 引数を指定すると、Y に含まれるいずれかの文字が X の左右両側から除去されます。 |
TYPEOF(X) |
式 X の型を返します。有効な戻り値は、'null'、'integer'、'real'、'text'、および 'blob' です。データ型の詳細については、「データ型のサポート」を参照してください。 |
UPPER(X) |
入力ストリング X の、すべての文字が大文字に変換されたコピーを返します。 |
ZEROBLOB(N) |
N バイトの 0x00 を含む BLOB を返します。 |
日付/時刻書式設定関数は、書式設定された日付および時刻データの作成に使用するスカラ関数のグループです。これらはストリング値および数値に作用し、ストリング値および数値を返します。DATE データ型に対して使用するものではありません。DATE データ型で宣言された列のデータを使用する場合、これらの関数は期待どおりに動作しません。
DATE(T, ...) |
DATE() 関数は、YYYY-MM-DD 形式の日付を含むストリングを返します。最初のパラメータ (T) では、「時刻書式」で示された書式の時刻ストリングを指定します。時刻ストリングの後に任意の数の修飾子を指定できます。修飾子については、「修飾子」を参照してください。 |
||||||||||||||||||||||||||
TIME(T, ...) |
TIME() 関数は、HH:MM:SS 形式の時刻を含むストリングを返します。最初のパラメータ (T) では、「時刻書式」で示された書式の時刻ストリングを指定します。時刻ストリングの後に任意の数の修飾子を指定できます。修飾子については、「修飾子」を参照してください。 |
||||||||||||||||||||||||||
| DATETIME(T, ...) | DATETIME() 関数は、YYYY-MM-DD HH:MM:SS 形式の日時を含むストリングを返します。最初のパラメータ (T) では、「時刻書式」で示された書式の時刻ストリングを指定します。時刻ストリングの後に任意の数の修飾子を指定できます。修飾子については、「修飾子」を参照してください。 |
||||||||||||||||||||||||||
| JULIANDAY(T, ...) | JULIANDAY() 関数は、グリニッジでの紀元前 4714 年 11 月 24 日の正午から指定された日付までの日数を示す数字を返します。最初のパラメータ (T) では、「時刻書式」で示された書式の時刻ストリングを指定します。時刻ストリングの後に任意の数の修飾子を指定できます。修飾子については、「修飾子」を参照してください。 |
||||||||||||||||||||||||||
| STRFTIME(F, T, ...) | STRFTIME() ルーチンは、最初の引数 F で指定された書式ストリングに従って書式設定された日付を返します。書式ストリングでは、次の置換がサポートされます。
2 番目のパラメータ ( T) では、「時刻書式」で示された書式の時刻ストリングを指定します。時刻ストリングの後に任意の数の修飾子を指定できます。修飾子については、「修飾子」を参照してください。 |
時刻ストリングには、次のいずれかの書式を使用できます。
| YYYY-MM-DD | 2007-06-15 |
| YYYY-MM-DD HH:MM | 2007-06-15 07:30 |
| YYYY-MM-DD HH:MM:SS | 2007-06-15 07:30:59 |
| YYYY-MM-DD HH:MM:SS.SSS | 2007-06-15 07:30:59.152 |
| YYYY-MM-DDTHH:MM | 2007-06-15T07:30 |
| YYYY-MM-DDTHH:MM:SS | 2007-06-15T07:30:59 |
| YYYY-MM-DDTHH:MM:SS.SSS | 2007-06-15T07:30:59.152 |
| HH:MM | 07:30 (日付は 2000-01-01) |
| HH:MM:SS | 07:30:59 (日付は 2000-01-01) |
| HH:MM:SS.SSS | 07:30:59:152 (日付は 2000-01-01) |
| now | 現在の日時 (協定世界時) |
| DDDD.DDDD | ユリウス日 (浮動小数点数) |
上記の書式に含まれる T は、日付と時間を区切るリテラル文字の "T" です。時刻のみを含む書式では、日付は 2001-01-01 と見なされます。
時刻ストリングの後に修飾子を 0 個以上続けることで、日付または日付の解釈を変更できます。使用できる修飾子は次のとおりです。
| NNN days | 時刻に加算する日数です。 |
| NNN hours | 時刻に加算する時間数です。 |
| NNN minutes | 時刻に加算する分数です。 |
| NNN.NNNN seconds | 時刻に加算する秒数およびミリ秒数です。 |
| NNN months | 時刻に加算する月数です。 |
| NNN years | 時刻に加算する年数です。 |
| start of month | 時刻を月の初めに戻します。 |
| start of year | 時刻を年の初めに戻します。 |
| start of day | 時刻を日の初めに戻します。 |
| weekday N | 時刻を指定した曜日に進めます (0 – 日曜日、1 – 月曜日など) |
| localtime | 日付をローカル時間に変換します。 |
| utc | 日付を協定世界時に変換します。 |
SQL は様々な演算子をサポートしています。それには、ほとんどのプログラミング言語に存在する一般的な演算子だけでなく、SQL に固有の演算子も含まれます。
次のリストは、SQL ブロックで使用できる二項演算子を優先順位の高い順に並べたものです。
次の単項前置演算子がサポートされています。
COLLATE 演算子は単項後置演算子と見なすことができます。COLLATE 演算子は優先順位が最も高く、常に他のどの前置単項演算子や二項演算子よりも強く結び付きます。
等号演算子と不等号演算子はそれぞれ 2 種類あります。等号演算子は = または ==、不等号演算子は != または <> です。
|| はストリングを連結する演算子で、そのオペランドである 2 つのストリングを 1 つにつなげます。
% 演算子は、右オペランドを法とする左オペランドの剰余を出力します。
二項演算子の結果は数値です。ただし、|| 連結演算子だけは例外で、結果がストリングになります。
LIKE 演算子は、パターンマッチングによる比較を行います。
LIKE 演算子の右オペランドにはパターンを指定し、左オペランドにはそのパターンと照合するストリングを指定します。パターン内のパーセント記号 (%) はワイルドカード文字で、ストリング内の 0 個以上連続した文字に一致します。パターン内のアンダースコア (_) はストリング内の任意の 1 文字に一致します。その他の文字はすべて、その文字そのものとして、大文字と小文字を区別せずに照合されます(メモ : データベースエンジンでは、7 ビットラテン文字の大文字と小文字のみが理解されます。したがって、8 ビット iso8859 文字または UTF-8 文字では、LIKE 演算子は大文字と小文字を区別します。たとえば、'a' LIKE 'A' という式は TRUE になりますが、'æ' LIKE 'Æ' は FALSE になります)。ラテン文字の大文字と小文字を区別するかどうかを切り替えるには、SQLConnection.caseSensitiveLike プロパティを使用します。
オプションの ESCAPE 句を指定する場合、ESCAPE キーワードの後に続く式は、1 文字で構成されるストリングに評価される必要があります。この文字は、LIKE パターンの中で、リテラルのパーセントまたはアンダースコア文字を照合するために使用できます。パターン内でエスケープ文字の後にパーセント記号、アンダースコア、またはエスケープ文字自体を記述すると、それらはそれぞれ、ストリング内のリテラルのパーセント記号、アンダースコア、またはエスケープ文字に一致します。
GLOB 演算子は LIKE と似ていますが、ワイルドカードとして UNIX のファイルグロビングのシンタックスを使用します。LIKE とは異なり、GLOB では大文字と小文字は区別されます。
IN 演算子は、左オペランドが、右オペランド (括弧で囲まれた値のセット) 内のいずれかの値と等しいかどうかを計算します。
右オペランドには複数のリテラル値をカンマで区切って記述するか、SELECT ステートメントを記述します。IN 演算子の右オペランドとして SELECT ステートメントを使用する際の説明と制限については、「式」の「SELECT ステートメント」を参照してください。
BETWEEN...AND 演算子は、2 つの式に対して >= 演算子と <= 演算子を使用するのと同じです。たとえば、x BETWEEN y AND z という式は x >= y AND x <= z と同じです。
NOT は否定の演算子です。GLOB、LIKE、および IN 演算子の前に NOT キーワードを付けると、テストの意味が逆になります (つまり、値が指定のパターンと一致しないことが確認されます)。
パラメータは、式の中でリテラル値を表すためのプレースホルダーを指定します。このプレースホルダーには、SQLStatement.parameters 結合配列に値を設定することで、実行時に値が格納されます。パラメータは次の 3 つの形式をとります。
? |
疑問符はインデックス付きのパラメータを示します。この形式のパラメータには、SQL ステートメントに登場した順に数値インデックス値が割り当てられます。インデックス値は 0 から始まります。 |
:AAAA |
コロンの後に識別名が付いた形式は、AAAA という名前の名前付きパラメータ用の場所を保持します。名前付きパラメータにも、SQL ステートメントに登場した順に数値インデックスが付けられます。混乱を避けるために、名前付きパラメータと数値インデックス付きパラメータを混在させないことをお勧めします。 |
@AAAA |
"@" はコロン (:) と同じです。 |
Adobe AIR でサポートされていない標準 SQL エレメントは次のとおりです。
FOREIGN KEY 制約は、解析はされますが適用されません。FOR EACH STATEMENT トリガはサポートされていません (トリガはすべて FOR EACH ROW にする必要があります)。INSTEAD OF トリガはテーブルではサポートされていません (INSTEAD OF トリガはビューに対してのみ使用できます)。再帰トリガ (自分自身をトリガするトリガ) はサポートされていません。ALTER TABLE コマンドでは、RENAME TABLE と ADD COLUMN 変数のみがサポートされています。その他の種類の ALTER TABLE 操作 (DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT など) は無視されます。RIGHT OUTER JOIN または FULL OUTER JOIN はサポートされていません。DELETE ステートメント、INSERT ステートメント、または UPDATE ステートメントは実行できません。ビューを DELETE、INSERT、または UPDATE しようとしたときに発生する INSTEAD OF トリガがサポートされており、このトリガの本体で基になるテーブルを更新できます。GRANT コマンドと REVOKE コマンドは実装されていません。次に示す SQL エレメントと SQLite 機能は、一部の SQLite 実装ではサポートされていますが、Adobe AIR ではサポートされていません。これらの機能のほとんどは、SQLConnection クラスのメソッドを通じて使用できます。
BEGIN、END、COMMIT、ROLLBACK) : この機能は SQLConnection クラスのトランザクション関連メソッド (SQLConnection.begin()、SQLConnection.commit()、および SQLConnection.rollback()) を通じて使用できます。ANALYZE : この機能は SQLConnection.analyze() メソッドを通じて使用できます。ATTACH : この機能は SQLConnection.attach() メソッドを通じて使用できます。COPY : このステートメントはサポートされていません。CREATE VIRTUAL TABLE : このステートメントはサポートされていません。DETACH : この機能は SQLConnection.detach() メソッドを通じて使用できます。PRAGMA : このステートメントはサポートされていません。VACUUM : この機能は SQLConnection.compact() メソッドを通じて使用できます。SQLConnection.loadSchema() メソッド」を参照してください。SQLITE_VERSION() 関数 : sqlite_version() 関数は、SQL ステートメントでは使用できません。MATCH() と REGEX()) : これらの関数は、SQL ステートメントでは使用できません。次の機能は、多くの SQLite の実装と Adobe AIR とで違いがあります。
次の列の類似性は、SQLite ではデフォルトでサポートされていませんが、Adobe AIR ではサポートされています。
次のリテラル値は、SQLite ではデフォルトでサポートされていませんが、Adobe AIR ではサポートされています。
true を表します。false を表します。ほとんどの SQL データベースとは異なり、Adobe AIR の SQL データベースエンジンでは、テーブルの列に特定の型の値を格納する必要はなく、特定の型が強制されることもありません。その代わりに、ランタイムでは記憶クラスと列の類似性という 2 つの概念を使用してデータ型が管理されます。この節では、記憶クラスと列の類似性について説明し、様々な条件下でデータ型の違いがどのように解決されるのかを示します。
記憶クラスは、データベースへの値の格納に使用される実際のデータ型を表します。次の記憶クラスが使用できます。
NULL 値です。SQL ステートメントに埋め込まれたリテラルとしてデータベースに渡される値、またはパラメータを使用して構成済みの SQL ステートメントにバインドされた値はすべて、SQL ステートメントが実行される前に記憶クラスに割り当てられます。
SQL ステートメントに含まれるリテラルは、一重引用符または二重引用符で囲まれている場合は記憶クラス TEXT に、引用符で囲まれておらず、小数点または指数のない数字として指定されている場合は INTEGER に、引用符で囲まれておらず、小数点または指数の付いた数字として指定されている場合は REAL に、値が NULL の場合は NULL に、それぞれ割り当てられます。リテラルを BLOB 記憶クラスに割り当てるには、X'ABCD' 表記を使用します。詳細については、「式」の「リテラル値」を参照してください。
SQLStatement.parameters 結合配列を使用してパラメータとして提供された値は、バインドされたネイティブのデータ型に最も近い記憶クラスに割り当てられます。たとえば、int 値は INTEGER 記憶クラスに、Number 値は REAL 記憶クラスに、String 値は TEXT 記憶クラスに、ByteArray オブジェクトは BLOB 記憶クラスに、それぞれ割り当てられます。
列の類似性は、その列に格納するデータに推奨される型です。INSERT ステートメントまたは UPDATE ステートメントで値を列に格納すると、ランタイムはその値のデータ型を指定された類似性に変換しようとします。たとえば、TEXT を類似性とする列に Date 型の値 (ActionScript または JavaScript の Date インスタンス) を挿入すると、Date 型の値は String 表現に変換されます。これは、データベースに格納する前にオブジェクトの toString() メソッドを呼び出した場合に相当します。値を指定された類似性に変換できない場合はエラーが発生し、処理は行われません。SELECT ステートメントを使用してデータベースから値を取得すると、格納時に別のデータ型から変換されているかどうかに関係なく、類似性に対応するクラスのインスタンスが返されます。
NULL 値を受け入れる列の場合、ActionScript または JavaScript の値 null をパラメータ値として指定し、列に NULL を格納することができます。NULL 記憶クラスの値を SELECT ステートメントで取得すると、列の類似性に関係なく、常に ActionScript または JavaScript の null 値が返されます。NULL 値を受け入れる列の場合、null を許容しない Number や Boolean などの型に値をキャストする前に、その列から取得した値が null かどうか必ず確認されます。
データベースの各列には、次のいずれかの類似性が割り当てられます。
TEXT または STRING 類似性の列には、記憶クラス NULL、TEXT、または BLOB を使用してすべてのデータが格納されます。数値データを TEXT 類似性の列に挿入すると、データがテキスト形式に変換されてから格納されます。
NUMERIC 類似性の列には、記憶クラス NULL、REAL、または INTEGER を使用して値が格納されます。テキストデータを NUMERIC 列に挿入すると、データを格納する前に整数または実数への変換が試みられます。変換に成功した場合は、INTEGER または REAL 記憶クラスを使用して値が格納されます (たとえば、値 '10.05' は REAL 記憶クラスに変換されてから格納されます)。変換できない場合は、エラーが発生します。NULL 値の変換は行われません。NUMERIC 列から取得した値は、値に適した最も具体的な数値型のインスタンスとして返されます。つまり、値が正の整数または 0 の場合、uint インスタンスが返され、負の整数の場合、int インスタンスが返されます。また、値に浮動小数点部分 (非整数) がある場合、Number インスタンスが返されます。
INTEGER 類似性を使用する列は、NUMERIC の類似性の列と同じように動作します。相違点は、浮動小数点部分のない実数値 (Number インスタンスなど) または浮動小数点部分のない実数値に変換できるテキスト値を挿入した場合に、値が整数に変換され、INTEGER 記憶クラスを使用して格納される点のみです。浮動小数点部分のある実数値を格納しようとすると、エラーが発生します。
REAL 類似性または NUMBER 類似性の列も NUMERIC 類似性の列と同じように動作しますが、整数値が強制的に浮動小数点表現に変更される点が異なります。REAL 型の列の値は、データベースから常に Number インスタンスとして返されます。
BOOLEAN 類似性の列には、true または false の値が格納されます。BOOLEAN 列は、値として ActionScript または JavaScript の Boolean インスタンスを受け入れます。コードで String 型の値が格納される際には、長さが 0 より大きいストリングの場合は true、空のストリングの場合は false と判別されます。コードで数値データが格納される際には、格納される値が 0 以外の場合は true、0 の場合は false と判別されます。SELECT ステートメントを使用して BOOLEAN 値を取得すると、その値は Boolean インスタンスとして返されます。NULL 以外の値は INTEGER 記憶クラスを使用して格納され (false の場合は 0、true の場合は 1)、データの取得時に Boolean オブジェクトに変換されます。
DATE 類似性の列には、日付と時刻の値が格納されます。DATE 列は値として ActionScript または JavaScript の Date インスタンスを受け入れるように設計されており、DATE 列に String 値を格納しようとすると、ランタイムでユリウス日付に変換されます。変換に失敗するとエラーが発生します。コードで Number、int、または uint の値を格納しようとした場合、日付の検証は行われず、有効なユリウス日付値と見なされます。SELECT ステートメントを使用して DATE 値を取得すると自動的に Date インスタンスに変換されます。DATE 値は REAL 記憶クラスを使用してユリウス日付値として格納されるので、ソート操作や比較操作も期待どおりに動作します。
XML または XMLLIST 類似性を使用する列には、XML 構造が格納されます。コードで SQLStatement パラメータを使用して XML 列にデータを格納すると、ランタイムでは ActionScript の XML() または XMLList() 関数を使用して値の変換と検証が行われます。値を有効な XML に変換できない場合、エラーが発生します。リテラル SQL テキスト値 (例 : INSERT INTO (col1) VALUES (' を使用してデータを格納すると値の解析や検証は行われず、正しい形式と判断されます。無効な値を格納した場合、その値の取得時に空の XML オブジェクトが返されます。XML および XMLLIST のデータは TEXT 記憶クラスまたは NULL 記憶クラスを使用して格納されます。
OBJECT 類似性の列には、Object クラスインスタンスおよび Object サブクラスインスタンスなど (例 : Array インスタンスやカスタムクラスインスタンスなど) の ActionScript または JavaScript の複合オブジェクトを格納します。OBJECT 列のデータは AMF3 形式で直列化され、BLOB 記憶クラスを使用して格納されます。値の取得時に AMF3 形式から非直列化され、格納されていたクラスのインスタンスとして返されます。表示オブジェクトなど一部の ActionScript クラスは、元のデータ型のインスタンスとして非直列化できません。カスタムクラスインスタンスの場合、格納する前に flash.net.registerClassAlias() メソッドを使用して (または Flex でクラス宣言に [RemoteObject] メタデータを追加して)、クラスのエイリアスを登録する必要があります。また、このデータを取得する前に、クラスに対して同じエイリアスを登録する必要があります。本質的に非直列化できないクラスであるため、あるいはクラスのエイリアスが未指定または不一致であるために適切に非直列化できないデータは、格納されている元のインスタンスに対応するプロパティと値を持つ匿名オブジェクト (Object クラスインスタンス) として返されます。
NONE 類似性の列には、優先される記憶クラスはありません。データを挿入する前にデータの変換は行われません。
列の類似性の型は、CREATE TABLE ステートメントで列に対して宣言された型によって決まります。類似性の型を決定する際は、次の規則が適用されます。
VARCHAR 型にはストリング "CHAR" が含まれているため、TEXT 類似性が割り当てられることに注意してください。CREATE TABLE t AS SELECT... ステートメントを使用してテーブルを作成する場合は、どの列にもデータ型が指定されていないので、すべての列が NONE 類似性になります。比較操作では、二項比較演算子の =、<、<=、>=、および != がサポートされています。また、複数の値のいずれかに一致するかどうかをチェックする IN 演算子と、三項比較演算子の BETWEEN も使用できます。これらの演算子の詳細については、「演算子」を参照してください。
比較の結果は、比較する 2 つの値の記憶クラスによって異なります。2 つの値を比較するときは、次の規則が適用されます。
数値記憶クラスとテキスト記憶クラスの間で二項比較を行うとき、データベースで比較が実行される前に必要に応じて値の変換が試みられます。数値記憶クラスとテキスト記憶クラスを比較するときは、次の規則が適用されます (メモ : 次の規則で使用されている「式」という用語には、列値以外の SQL スカラ式やリテラルも含まれます。たとえば、X と Y.Z が列名の場合、+X と +Y.Z は式と見なされます)。
三項演算子 BETWEEN は常に、同等の二項式として再構成されます。たとえば、a BETWEEN b AND c は a >= b AND a <= c に再構成されます。この処理は、この式を評価するために必要なそれぞれの比較において a に異なる類似性が適用される場合でも変わりません。
a IN (SELECT b ....) という形式の式も、上記の二項比較に関する 3 つの規則に従って(つまり、a = b と同じように)処理されます。たとえば、b が列の値で a が式の場合は、比較が行われる前に、b の類似性が a に適用されます。式 a IN (x, y, z) は a = +x OR a = +y OR a = +z として再構成されます。IN 演算子の右の値 (この例では x、y、および z の値) は、それが列の値であっても式と見なされます。IN 演算子の左の値が列の場合は、その列の類似性が使用されます。左の値が式の場合は、変換は行われません。
また、COLLATE 句を使用して比較方法を変更することもできます。詳細については、「COLLATE」を参照してください。
サポートされている各数値演算子 (*、/、%、+、および -) のいずれを使用するときも、式を評価する前に各オペランドに数値の類似性が適用されます。どのオペランドも NUMERIC 記憶クラスに変換できない場合、その式は NULL に評価されます。
連結演算子 || を使用するときは、式が評価される前に各オペランドが TEXT 記憶クラスに変換されます。どのオペランドも TEXT 記憶クラスに変換できない場合、その式の結果は NULL になります。このように、値を変換できない状況は次の 2 つの場合に起こります。1 つはオペランドの値が NULL の場合、もう 1 つはオペランドの値が TEXT 以外の記憶クラスを含む BLOB である場合です。
ORDER BY 句によって値をソートしたときの並び順は、最初が記憶クラス NULL の値、次が数字順に INTEGER 値と REAL 値、その次がバイナリ順または指定された照合シーケンス (BINARY または NOCASE) に基づく TEXT 値、最後がバイナリ順の BLOB 値です。ソートの前に記憶クラスの変換は行われません。
GROUP BY 句を使用して値をグループ化するとき、記憶クラスの異なる値は別のものと見なされます。ただし、INTEGER 値と REAL 値は、数値的に等しい場合には同じと見なされます。GROUP BY 句の結果として、値に類似性が適用されることはありません。
複合 SELECT 演算子の UNION、INTERSECT、および EXCEPT は、値どうしを暗黙的に比較します。これらの比較が行われる前に、それぞれの値に類似性が適用される場合があります。可能であれば、複合 SELECT ステートメントの結果セットの 1 つの列で返されるすべての値に同じ類似性が適用されます。適用される類似性は、その位置に (他の種類の式ではなく) 列値を持つ最初のコンポーネントである SELECT ステートメントによって返される列の類似性です。特定の複合 SELECT 列について、どの SELECT ステートメントのコンポーネントも列値を返さない場合、その列では類似性を適用せずに値の比較が行われます。
このドキュメントに記載された SQL ステートメントの定義では、次の表記規則を使用しています。
UPPER CASE - リテラルの SQL キーワードはすべて大文字で表記されています。lower case - プレースホルダーの項または句の名前はすべて小文字で表記されています。::= - 句またはステートメントの定義を示します。| - パイプ文字は置換可能なオプションの間で使用されており、"または" に読み替えることができます。[] - 角括弧で囲まれた項目はオプション項目です。角括弧の中には、単一の項目、または互いに置換可能な複数の項目を記載できます。() - 置換可能な複数の項目 (パイプ文字で区切られた項目) が丸括弧で囲まれている場合は、必須の項目グループ (つまり、単一の必須項目に対して有効な値となる複数の項目) を示します。繰り返し制御文字
+ - 丸括弧で囲まれた項目の後にプラス文字が付いている場合は、前の項目を 1 回以上繰り返すことができることを示します。* - 角括弧で囲まれた項目の後にアスタリスク文字が付いている場合は、前の (角括弧で囲まれた) 項目を 0 回以上繰り返すことができることを示します。* - 列名、または関数名の後の丸括弧の中でアスタリスク文字が使用されている場合は、"0 回以上" の繰り返しではなく、リテラルのアスタリスク文字を示します。. - ピリオド文字はリテラルのピリオドを表します。, - カンマ文字はリテラルのカンマを表します。() - 単一の句または項目を囲む 1 組の丸括弧は、その丸括弧が必須のリテラルの丸括弧文字であることを示します。