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

SQLiteチュートリアル(V): データベースとトランザクション

2022-01-19 07:26:51

I. データベースのアタッチメント

     ATTACH DATABASE文は、現在の接続に別のデータベース・ファイルを追加します。ファイル名が ":memory:" であれば、メモリー データベースとして扱うことができ、メモリー データベースはディスク ファイルに永続化することができません。Attachedデータベースのテーブルを操作する場合は、dbname.table_nameのように、テーブル名の前にデータベース名を付ける必要があります。最後に、トランザクションに複数のAttachedデータベースの操作が含まれている場合でも、トランザクションはアトミックであることに注意する必要があります。以下の例を参照してください。

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

    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> INSERT INTO testtable VALUES(1);
    sqlite> .backup 'D:/mydb.db' -- Back up the primary database in the current connection to the specified file.
    sqlite> .exit
    -- Relogin the sqlite command line tool at.
    sqlite> CREATE TABLE testtable (first_col integer);
    sqlite> INSERT INTO testtable VALUES(2);
    sqlite> INSERT INTO testtable VALUES(1);
    sqlite> ATTACH DATABASE 'D:/mydb.db' AS mydb;   
    sqlite> .header on -- Query results output field names as headers.
    sqlite> .mode column -- Display each column separately.
    sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col = t2.first_col;
    first_col
    ----------
    1   

II. データベースを切り離す。
    現在の接続で指定されたデータベースをアンインストールします。mainデータベースとtempデータベースはアンインストールできないので注意してください。次の例を参照してください。
コピーコード コードは以下の通りです。

    -- This example hosts the result of the above example, i.e. the mydb database has been attached to the current connection.
    sqlite> DETACH DATABASE mydb;
    sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col = t2.first_col;
    Error: no such table: mydb.testtable

III. トランザクション

    SQLite では、現在表示されている SQL コマンド (SELECT 以外) にトランザクションが指定されていない場合、SQLite は自動的にその操作に暗黙のトランザクションを追加し、その操作の原子性と一貫性を保証します。もちろん、SQLite は表示されるトランザクションもサポートしています。これは、ほとんどのリレーショナルデータベースと比較して、基本的に同じ構文を持っています。次の例を見てください。

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

    sqlite> BEGIN TRANSACTION;
    sqlite> INSERT INTO testtable VALUES(1);
    sqlite> INSERT INTO testtable VALUES(2);
    sqlite> COMMIT TRANSACTION; -- shows that the transaction was committed and the data in the data table was changed.
    sqlite> SELECT COUNT(*) FROM testtable;
    COUNT(*)
    ----------
    2
    sqlite> BEGIN TRANSACTION;
    sqlite> INSERT INTO testtable VALUES(1);
    sqlite> ROLLBACK TRANSACTION; -- shows that the transaction was rolled back with no changes to the data in the data table.
    sqlite> SELECT COUNT(*) FROM testtable;
    COUNT(*)
    ----------
    2