学ぶ前に情報を見つけてください
SQLite SQL
データベースを接続
トランザクションを開始
コメント
トランザクションをコミット
コピー
インデックスを作成
テーブルを作成
トリガーを作成
ビューを作成
削除
データベースのデタッチ
インデックスの削除
テーブルのドロップ
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT 句
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
の qlite FAQ
(1) 自動成長フィールドを作成するには?
短い答え: INTEGER PRIMARY KEY として宣言された列は自動的に拡張されます。
より長い答え: テーブルの列を INTEGER PRIMARY KEY として宣言した場合、その列に NULL 値を挿入するたびに、NULL は列の最大値より 1 大きい整数に自動的に変換されます。テーブルが空の場合は 1 になります。 (最大の主キーが 9223372036854775807 の場合、キー値はランダムな未使用の数値になります。) たとえば、次のリストがあります:
CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
) ;
in このテーブルでは、次のステートメント
INSERT INTO t1 VALUES(NULL,123);
は論理的に次と同等です:
INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
はい sqlite3_last_insert_rowid() と呼ばれる新しい API は、最後に挿入された整数値を返します。
この整数は、挿入前にテーブル内のその列の最大値より 1 大きいことに注意してください。このキー値は現在のテーブル内で一意です。ただし、テーブルから削除された値と重複する可能性があります。テーブルのライフサイクル全体を通じて一意のキー値を作成するには、AUTOINCREMENT ステートメントを INTEGER PRIMARY KEY に追加する必要があります。その後、新しいキー値は、テーブル内にこれまでに存在した最大値より 1 大きくなります。可能な最大の整数値がデータ テーブルに存在する場合、INSERT は SQLITE_FULL エラー コードで失敗します。
---------------------------------------------- --- ----------------------------------
(2)SQLite3 はどのようなデータ型をサポートしていますか?
NULL
INTEGER
REAL
TEXT
BLOB
しかし実際には、sqlite3 は次のデータ型も受け入れます:
smallint 16 ビット整数。
interger 32 ビット整数。
decmal(p,s) p の正確な値とサイズ s の 10 進整数。正確な値 p は合計桁数 (桁数) を指し、s は小数点以下の桁数を指します。指定しない場合、システムは p=5 を設定します。
float 32 ビット実数。
double 64 ビット実数。
char(n) n 長さの文字列。n は 254 を超えることはできません。
varchar(n) 可変長の文字列で、最大長は n です。n は 4000 を超えることはできません。
graphic(n) は char(n) と同じですが、その単位は全角 2 文字であり、n は 127 を超えることはできません。この形式は、漢字など、2 文字の長さのフォントをサポートするためのものです。
vargraphic(n) 可変長の 2 文字の文字列。n の最大長は 2000 を超えることはできません。
日付には年、月、日が含まれます。
時間には、時間、分、秒が含まれます。
タイムスタンプには、年、月、日、時、分、秒、1000分の1秒が含まれます。
http://www.sqlite.org/datatype3.htmlを参照してください。
-------------------------------- --------------------------------------
(3) SQLite では、整数フィールドに文字列を挿入できます。
これは機能であり、バグではありません。 SQLite はデータ型の制約を強制しません。任意のデータを任意の列に挿入できます。任意の長さの文字列を整数列に挿入したり、浮動小数点数をブール列に挿入したり、日付値を文字列に挿入したりできます。 CREATE TABLE で指定されたデータ型は、列へのデータの挿入を制限しません。どの列でも任意の長さの文字列を受け入れることができます (ただし、INTEGER PRIMARY KEY とマークされた列には 64 ビット整数のみを格納できるという 1 つのケースを除きます。そのような列に整数以外のデータを挿入すると、エラーが発生します。
しかし、SQLite はしたがって、たとえば、整数列に文字列を挿入すると、SQLite はその文字列を整数に変換しようとします。それ以外の場合は、文字列が挿入されます。このプロパティは、タイプまたは列のアフィニティと呼ばれることもあります
-------------------------- ----------- -------------------------------------- ---
(4) SQLite はなぜ同じテーブルの 2 つの異なる行で主キーとして 0 と 0.0 を使用することはできませんか?
主キーは数値型である必要があります。主キーを TEXT 型に変更しても機能しません。
各行には一意の主キーが必要です。数値列の場合、整数として比較すると等しいため、SQLite は '0' と '0.0' を同じものとみなします (前の質問を参照)。したがって、この値は一意ではありません。
---------------------------------------------- --- ----------------------------------
(5) 複数のアプリケーション、または 1 つのアプリケーションの複数のインスタンス同じデータベースファイルに同時にアクセスできますか?
複数のプロセスが同時に同じデータベースを開くことができます。複数のプロセスが同時に SELECT 操作を実行できますが、データベースに変更を加えられるプロセスは一度に 1 つだけです。
SQLite は読み取りおよび書き込みロックを使用してデータベースへのアクセスを制御します。 (読み取りおよび書き込みロックをサポートしていない Win95/98/ME などのシステムでは、代わりに確率的シミュレーションが使用されます。) ただし、使用するときは注意してください。データベース ファイルが NFS ファイル システムに保存されている場合、このロック メカニズムは、正常に動作できません。これは、fcntl() ファイル ロックが多くの NFS で正しく実装されていないためです。複数のプロセスが同時にデータベースにアクセスする可能性がある場合は、データベース ファイルを NFS に配置しないようにする必要があります。 Windows では、Microsoft のドキュメントに次のように記載されています。 share.exe デーモンを実行せずに FAT ファイル システムを使用すると、ロックが正しく機能しない可能性があります。 Windows の経験が豊富な人々は、次のように言いました。ネットワーク ファイルの場合、ファイル ロックの実装には多くのバグがあり、信頼性が低いです。彼らの言うことが正しければ、2 台以上の Windows マシン間でデータベースを共有すると、望ましくない問題が発生する可能性があります。
SQLite ほど同時実行性を処理できる埋め込み SQL データベース エンジンは他にないことを認識しています。 SQLite を使用すると、複数のプロセスが同時にデータベースを開き、同時にデータベースを読み取ることができます。プロセスが書き込みを行う場合、更新プロセス中にデータベース ファイルをロックする必要があります。しかし、それは通常、わずか数ミリ秒です。他のプロセスは、書き込みプロセスが作業を完了するのを待つだけで済みます。通常、他の組み込み SQL データベース エンジンでは、一度に 1 つのプロセスのみがデータベースに接続できます。
ただし、クライアント/サーバー データベース エンジン (PostgreSQL、MySQL、Oracle など) は通常、より高いレベルの同時実行性をサポートし、複数のプロセスが同じデータベースに同時に書き込むことができます。このメカニズムは、データベースへのアクセスを制御および調整する単一のサーバー プロセスが常に存在するため、クライアント/サーバー構造のデータベースで可能です。アプリケーションで多くの同時実行性が必要な場合は、クライアント/サーバー データベースの使用を検討する必要があります。しかし、経験によれば、多くのアプリケーションでは、設計者が想像していたよりもはるかに少ない同時実行性が必要になることがよくあります。
SQLite が別のプロセスによってロックされたファイルにアクセスしようとすると、デフォルトの動作は SQLITE_BUSY を返します。この動作は、sqlite3_busy_handler() または sqlite3_busy_timeout() API 関数を使用して C コードで調整できます。
------------------------------------------------- ------------------------