1. ホーム
  2. データベース
  3. エスキューエルライト

SQLiteチュートリアル(3)。データテーブルとビューの紹介

2022-01-24 17:52:20

I. データテーブルの作成

    このコマンドの構文ルールと使い方は、基本的にほとんどのリレーショナルデータベースと同じなので、ここでは例としてSQLiteでテーブルを作成するための様々なルールを説明することに変わりはありません。しかし、いくつかの SQLite 固有のルールについては、補足説明をします。注意: 以下の例はすべて、sqlite に付属するコマンドラインツールで行っています。

    1). 最もシンプルなデータテーブル。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer);

    ここで重要なのは、testtableのようなカスタムデータテーブルのテーブル名の場合、sqlite_で始めることはできないということです。この接頭辞で定義されたテーブル名はすべてsqliteの内部で使用されるからです。

    2). デフォルト値でデータテーブルを作成する場合。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0, second_col varchar DEFAULT 'hello');

    3). 指定されたデータベースにテーブルを作成します。
コピーコード コードは以下の通りです。

    sqlite> ATTACH DATABASE 'd:/mydb.db' AS mydb;
    sqlite> CREATE TABLE mydb.testtable (first_col integer);

    ここでは、まず ATTACH DATABASE コマンドを使用して既存のデータベースファイルを現在の接続にアタッチし、次に mydb.testtable のようにデータベース名を指定してターゲットデータベースにデータテーブルを作成します。このルールに関する補足事項があります。一時テーブルを作成する必要がある場合、データベース名を指定する必要はありませんが、次の例を参照してください。
    -- 一時テーブルと通常テーブルの2つのテーブルを作成します。
コピーコード コードは以下の通りです。

    sqlite> CREATE TEMP TABLE temptable(first_col integer);
    sqlite> CREATE TABLE testtable (first_col integer);   

    --現在の接続からローカルファイルにキャッシュされたデータをエクスポートし、現在の接続を終了します。
コピーコード コードは以下の通りです。

    sqlite> .backup d:/mydb.db
    sqlite> .exit

    -- sqliteへの接続を再確立し、先ほどエクスポートしたデータベースをマスターとして再インポートしてください。
コピーコード コードは以下の通りです。

    sqlite> .restore d:/mydb.db

    --このデータベースのテーブル情報を見ると、一時テーブルがデータベースファイルに永続化されていないことが結果でわかります。
コピーコード コードは以下の通りです。

    sqlite> .tables
    testtable   

    4). "IF NOT EXISTS"節。
    現在作成されているデータテーブルの名前がすでに存在する場合、つまり、すでに存在するテーブル名、ビュー名、およびインデックス名と競合する場合、この作成操作は失敗し、エラーが報告されます。しかし、テーブルが "IF NOT EXISTS" 節で作成された場合、現在のテーブル名がインデックス名と競合しない限り、この作成は何の効果もなく、つまり、エラーは発生しません。
コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer);
    Error: table testtable already exists
    sqlite> CREATE TABLE IF NOT EXISTS testtable (first_col integer);

    5). create table ... AS SELECT.
    このようにして作成されたデータ・テーブルは、SELECTクエリが返す結果セットと同じスキーマ情報を持ちますが、デフォルト値や主キーのような制約情報は含まれません。しかし、新しく作成されたテーブルには、結果セットから返されたすべてのデータが含まれます。
コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable2 AS SELECT * FROM testtable;   
    sqlite> .schema testtable2
    CREATE TABLE testtable2(first_col INT);

    .schemaコマンドはsqlite3コマンドラインツールの組み込みコマンドで、現在のデータテーブルのCREATE TABLEステートメントを表示します。   

    6). 主キー制約です。

コピーコード コードは以下の通りです。

    -- Specify the primary key directly on the definition of the field.
    sqlite> CREATE TABLE testtable (first_col integer PRIMARY KEY ASC);
    -- After all the fields have been defined, then define the table number constraints, here a joint primary key based on first_col and second_col is defined.
    sqlite> CREATE TABLE testtable2 (
       ... > first_col integer,
       ... > second_col integer,
       ... > PRIMARY KEY (first_col,second_col)
       ... > );

    他のリレーショナル・データベースと同様、主キーは一意でなければならない。

    7). 一意性制約。

コピーコード コードは以下の通りです。

    -- Specify the uniqueness constraint directly on the definition of the field.
    sqlite> CREATE TABLE testtable (first_col integer UNIQUE);
    -- After all the fields have been defined, define the table uniqueness constraint, in this case a uniqueness constraint based on two columns.
    sqlite> CREATE TABLE testtable2 (
       ... > first_col integer,
       ... > second_col integer,
       ... > UNIQUE (first_col,second_col)
       ... > );   
    In SQLite, a NULL value is treated as different from any other value, so as to include and other NULL values, as in the following example.
    sqlite> DELETE FROM testtable;
    sqlite> SELECT count(*) FROM testtable;
    count(*)
    ----------
    0
    sqlite> INSERT INTO testtable VALUES(NULL);
    sqlite> INSERT INTO testtable VALUES(NULL);
    sqlite> SELECT count(*) FROM testtable;
    count(*)
    ----------
    2  

    ご覧のように、NULL値の挿入は両方とも成功しました。

    8). NULL (NOT NULL)制約です。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable(first_col integer NOT NULL);
    sqlite> INSERT INTO testtable VALUES(NULL);
    Error: testtable.first_col may not be NULL

    出力からわかるように、first_colは非NULL制約で定義されているので、もうNULL値を挿入することはできません。   

    9). チェック可能性制約です。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer CHECK (first_col < 5));
    sqlite> INSERT INTO testtable VALUES(4);
    sqlite> INSERT INTO testtable VALUES(20); -- 20 violates the checkability constraint on field first_col (first_col < 5)
    Error: constraint failed
    -- Like the other constraints before it, checkability constraints can be defined based on multiple columns in a table.   
    sqlite> CREATE TABLE testtable2 (
       ... > first_col integer,
       ... > second_col integer,
       ... > CHECK (first_col > 0 AND second_col < 0)
       ... > );

II. テーブルの修正

    SQLite は ALTER TABLE コマンドを非常に限定的にサポートしており、テーブル名の修正と新しいフィールドの追加のみを行います。その他の機能、例えばフィールド名の変更、フィールドの削除、削除制約の追加などはサポートされています。

    1). テーブル名を修正する。

    まず、SQLiteでのテーブル名の変更は同一データベース内でのみ可能であり、Attachedデータベースへの移動はできないことに注意が必要です。また、一度テーブル名を変更すると、そのテーブルに既に存在するインデックスは影響を受けませんが、そのテーブルに依存するビューやトリガーは再定義する必要があります。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> ALTER TABLE testtable RENAME TO testtable2;
    sqlite> .tables
    testtable2   

    .tablesコマンドの出力は、テーブルtesttableがtesttable2に変更されたことを示しています。   

    2). 新しいフィールドを追加しました。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> ALTER TABLE testtable ADD COLUMN second_col integer;
    sqlite> .schema testtable
    CREATE TABLE "testtable" (first_col integer, second_col integer);

    .schemaコマンドの出力は、テーブルtesttableの定義に追加されたフィールドがすでに含まれていることを示しています。   
    ALTER TABLE に関する最後の注意点は、SQLite におけるこのコマンドの実行時間は現在のテーブルの行数に影響されないということです。つまり、1000万行のデータを持つテーブルを修正するのと、1行のデータしかないテーブルを修正するのとでは、ほとんど同じ時間がかかるということです。
III. テーブルの削除

    SQLite でテーブルが削除されると、それに関連するインデックスとトリガーも一緒に削除されます。これは他の多くのリレーショナルデータベースでは不可能であり、関連するオブジェクトを削除しなければならない場合、テーブルの削除文にWITH CASCADE句を追加することによってのみ可能です。次の例を見てください。

コピーコード コードは以下の通りです。

    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> DROP TABLE testtable;
    sqlite> DROP TABLE testtable;
    Error: no such table: testtable
    sqlite> DROP TABLE IF EXISTS testtable; 

    上の例からわかるように、削除されたテーブルが存在しない場合、SQLiteはエラーを報告し、エラーメッセージを出力します。例外を発生させずに実行したい場合は、CREATE TABLEと全く同じ意味を持つIF EXISTS句を追加すればよいのです。
IV. ビューを作成する。

    ここでは、簡単なSQLコマンドの例を挙げているだけです。一時ビュー、"IF NOT EXISTS" 節など、特定の意味や技術的な詳細については、上記のデータテーブルの作成セクションを参照することができます。
    1). 最もシンプルな見方。

コピーコード コードは以下の通りです。

    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;   

    2). 一時的なビューを作成する。
コピーコード コードは以下の通りです。

    sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable WHERE first_col > 100;

    3). "IF NOT EXISTS"節。
コピーコード コードは以下の通りです。

    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;
    Error: table testview already exists
    sqlite> CREATE VIEW IF NOT EXISTS testview AS SELECT * FROM testtable WHERE first_col > 100;

V. ビューを削除する。

    この操作の構文は、基本的にテーブルの削除と同じなので、ここでは一例として紹介します。

コピーコード コードは以下の通りです。

    sqlite> DROP VIEW testview;
    sqlite> DROP VIEW testview;
    Error: no such view: testview
    sqlite> DROP VIEW IF EXISTS testview;