3

sqlite データベース内に複数のテーブルがある場合、自動インクリメントの主キーがあるかどうかという情報をどのように取得できますか?

たとえば、次のクエリを実行するだけで、テーブルの列に関する情報を取得できることは既に認識しています。pragma table_info(tablename_in_here)

ブール値を使用してソース コード内の対応する各モデルを設定するよりも、自動インクリメント列を動的に取得する方がはるかに優れています。

編集:
この表を例として使用しましょう:

CREATE TABLE "test" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" TEXT NOT NULL
)

これは実行後の結果テーブルですpragma table_info("test")

cid | name | type    | notnull | dflt_value | pk
  0 |   id | INTEGER |       1 |       null |  1
  1 | name |    TEXT |       1 |       null |  0

ご覧のとおり、id列が自動インクリメントかどうかの情報はありません

Edit2:
ステートメントを介して直接sqliteを使用するソリューションを探しています。ターミナル内のコマンドを使用して、内部から必要な情報を解析できるという
特殊な状況は受け入れられません。端末でプログラムによってコマンドを実行することが許可されていない状況では機能しません。Android アプリのように。sqlite3

4

2 に答える 2

4

自動インクリメント主キーは、または同等のものとして宣言する必要があるため、日付を使用してそれらを検出できます。INTEGER PRIMARY KEYtable_info

PRAGMA table_info出力で、次INTEGER PRIMARY KEYの場合、列は列です。

  • typeisintegerまたはINTEGERその他の大文字と小文字を区別しないバリアント。と
  • pk設定されています。と
  • pk他の列には設定されていません。

列定義にキーワードが含まれているかどうかを確認するには、 sqlite_masterテーブルAUTOINCREMENTを直接調べる必要があります。SQLite には、この情報にアクセスする他のメカニズムはありません。このクエリがレコードを返す場合、テーブル定義のどこかにキーワードがあります (この単語がコメント アウトされていると、間違った結果が返される可能性があります)。AUTOINCREMENT

SELECT 1
FROM sqlite_master
WHERE type = 'table'
  AND name = 'tablename_in_here'
  AND sql LIKE '%AUTOINCREMENT%'
于 2013-09-09T09:06:35.180 に答える
0

の出力を解析できます.schema。これにより、テーブルの作成に使用した sql コマンドが得られます。自動インクリメントが宣言されている場合は、出力に表示されます。これには、すべてのテーブルもリストされるという利点があります。

于 2013-09-09T13:30:17.963 に答える