ホームページ  >  記事  >  php教程  >  PHP SQLite の学習ノートと FAQ 分析ページ 1/2

PHP SQLite の学習ノートと FAQ 分析ページ 1/2

WBOY
WBOYオリジナル
2016-06-13 12:27:59992ブラウズ

学習するまでは、学習する前に情報を見つけてください。
SQLite sql
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
テーブルの作成
トリガーの作成
ビューの作成
削除
データベースのデタッチ
インデックスのドロップ
テーブルのドロップ
トリガーのドロップ
ビューのドロップ
トランザクションの終了
説明

INSERT
ON CONFLICT 句
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE


sqlite FAQ
(1) 自動拡張フィールドを作成するにはどうすればよいですか?

短い答え: INTEGER PRIMARY KEY として宣言された列は自動的に拡張されます。

詳しい答え: テーブルの列を INTEGER PRIMARY KEY として宣言すると、その列に NULL 値を挿入するたびに、NULL はその列の最大値より大きい値に自動的に変換されます。 1 の整数。リストが空の場合は 1 になります。 (可能な最大の主キーが 9223372036854775807 の場合、キー値はランダムな未使用の数値になります。) たとえば、次のリストがあります:

CREATE TABLE t1(
a INTEGER PRIMARY KEY ,
b INTEGER
);

このテーブルでは、次のステートメント

INSERT INTO t1 VALUES(NULL,123); と論理的に等価です。 :

INSERT INTO t1 VALUES((SELECT max(a) FROM t1) 1,123);

sqlite3_last_insert_rowid() という新しい API があり、最後に挿入された整数値を返します。

この整数は、挿入前のテーブルの列の最大値より 1 大きくなることに注意してください。このキー値は現在のテーブル内で一意です。ただし、テーブルから削除された値と重複する可能性があります。テーブルのライフサイクル全体を通じて一意のキー値を作成するには、INTEGER PRIMARY KEY に AUTOINCREMENT ステートメントを追加する必要があります。その後、新しいキー値は、テーブル内にこれまでに存在した最大値より 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 の最大長は 4000 を超えることはできません。
graphic(n) は char(n) と同じですが、単位は 2 文字の全角で、n は 127 を超えることはできません。この形式は、漢字などの長さ 2 文字のフォントをサポートするためのものです。
vargraphic(n) 可変長で最大長が n の 2 文字の文字列。n は 2000 を超えることはできません。
date には年、月、日が含まれます。
時間には、時間、分、秒が含まれます。
タイムスタンプには、年、月、日、時、分、秒、および 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)複数缶アプリケーションまたはアプリケーションの複数のインスタンスが同じデータベース ファイルに同時にアクセスしますか?

複数のプロセスが同時に同じデータベースを開くことができます。複数のプロセスが同時に SELECT 操作を実行できますが、データベースに変更を加えられるプロセスは一度に 1 つだけです。

SQLite は、読み取りおよび書き込みロックを使用してデータベースへのアクセスを制御します。 (読み取りおよび書き込みロックをサポートしていない Win95/98/ME などのシステムでは、代わりに確率的シミュレーションが使用されます。) ただし、使用するときは注意してください。データベース ファイルが NFS ファイル システムに保存されている場合、このロック メカニズムは、正常に動作しない。これは、fcntl() ファイル ロックが多くの NFS で正しく実装されていないためです。複数のプロセスが同時にデータベースにアクセスする可能性がある場合は、データベース ファイルを NFS に配置しないようにする必要があります。 Windows では、Microsoft のドキュメントに次のように記載されています。 share.exe デーモンを実行せずに FAT ファイル システムを使用すると、ロックが正しく機能しない可能性があります。 Windows の経験が豊富な人々は、次のように言いました。ネットワーク ファイルの場合、ファイル ロックの実装には多くのバグがあり、信頼性が低いです。彼らの言うことが正しければ、2 台以上の Windows マシン間でデータベースを共有すると、望ましくない問題が発生する可能性があります。

私たちは、他の組み込み SQL データベース エンジンが SQLite ほど同時実行性を処理できないことを認識しています。 SQLite を使用すると、複数のプロセスが同時にデータベースを開き、同時にデータベースを読み取ることができます。プロセスが書き込みを行う場合、更新プロセス中にデータベース ファイルをロックする必要があります。しかし、それは通常、わずか数ミリ秒です。他のプロセスは、書き込みプロセスが作業を完了するのを待つだけで済みます。通常、他の組み込み SQL データベース エンジンでは、一度に 1 つのプロセスのみがデータベースに接続できます。

ただし、クライアント/サーバー データベース エンジン (PostgreSQL、MySQL、Oracle など) は通常、より高いレベルの同時実行性をサポートし、複数のプロセスが同じデータベースに同時に書き込むことができます。このメカニズムは、データベースへのアクセスを制御および調整する単一のサーバー プロセスが常に存在するため、クライアント/サーバー構造のデータベースで可能です。アプリケーションで多くの同時実行性が必要な場合は、クライアント/サーバー データベースの使用を検討する必要があります。しかし、経験によれば、多くのアプリケーションでは、設計者が想像していたよりもはるかに少ない同時実行性が必要になることがよくあります。

SQLite が別のプロセスによってロックされているファイルにアクセスしようとすると、デフォルトの動作は SQLITE_BUSY を返します。この動作は、sqlite3_busy_handler() または sqlite3_busy_timeout() API 関数を使用して C コードで調整できます。
----------------------------------------------- ------------------------------------

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。