MySQLのDESCRIBE [テーブル]に相当するSQLiteはありますか?


441

SQLiteの学習を始めたばかりです。MySQLのように、テーブルの詳細を表示できると便利ですDESCRIBE [table]PRAGMA table_info [table]基本的な情報しか含まれていないため、十分ではありません(たとえば、列が何らかのフィールドであるかどうかは表示されません)。SQLiteはこれを行う方法を持っていますか?

回答:


559

SQLiteのコマンドラインユーティリティを持っている.schema TABLENAMEあなたのショーは、ステートメントを作成するコマンドを。


65
テーブルなしで ".schema"を使用すると、それらすべてが表示されます。
Dan Benamy、2012年

43
ステートメントの最後にセミコロンを省略することを忘れないでください
RTF

10
セミコロンは必要ありません
Simon

40
@Simonセミコロンを指定すると、コマンドが通知なしで失敗します。
djeikyb 2014年

4
@djeikyb。これはバグと考えるべきではありませんか?
Makan Tayebi 2014

292
PRAGMA table_info([tablename]);

19
これは.schema tablename、私よりもMySQLの記述に相当します。
tybro0103

2
うん。これでうまくいきました。.schema TABLENAMEはしませんでした。ただし、.schemaだけではすべてのcreateステートメントが表示されますが、PRAGMAの結果は、1つのテーブルだけを確認したい場合に非常に役立ちます。
Dev Kanchen 2012

15
これは、コマンドラインインターフェイスに依存するのではなく、クエリを介して機能するため、受け入れられる答えのようです。私からの+1。
Akoi Meexx 2012

補遺:私が気づいている唯一のことは、INTEGER PRIMARY KEYを使用してテーブルを作成するときに、PRIMARY KEYを出力しないことです。INTEGERのみです。
Akoi Meexx 2012

3
@AkoiMeexx:私の元の質問から:「PRAGMA table_info [table]基本的な情報しか含まれていないため、十分ではありません(たとえば、列が何らかのフィールドであるかどうかは表示されません)。」
マシュー

115

テーブルの生成に使用されるSQLを探していますか?そのために、あなたsqlite_masterテーブルクエリすることができます

sqlite> CREATE TABLE foo (bar INT, quux TEXT);
sqlite> SELECT * FROM sqlite_master;
table|foo|foo|2|CREATE TABLE foo (bar INT, quux TEXT)
sqlite> SELECT sql FROM sqlite_master WHERE name = 'foo';
CREATE TABLE foo (bar INT, quux TEXT)

これと何か違いはあります.schema fooか?
マシュー

15
@Matthew:.schemaコマンドラインからのみ使用できます。上記のコマンドは、ライブラリ(Python、C#など)を介してクエリとして実行できます。
Mark Rushakoff、2010

@MarkRushakoffしかし、結果は同じですか?
dvb

2
+1 "SELECT * FROM sqlite_master"は、WebSqlのデバッグ時にChrome開発ツールで機能します
contactmatt


6

他の回答へのコメントの一部によって人々が誤解を招くことを防ぐために:

  1. 場合.schemaまたはquery from sqlite_master任意の出力を与えていない、それが存在しないことを示すtablename例えば、これもによって引き起こされる可能性;のための末尾にセミコロン.schema.tablesテーブルが実際に存在していない...それともので、。それ.schemaだけではうまくいかない可能性は非常に低いため、sqliteプロジェクトでバグレポートを提出する必要があります。

... .schemaはコマンドラインからのみ使用できます。上記のコマンドは、ライブラリ(Python、C#など)を介してクエリとして実行できます。– Mark Rushakoff、2010年7月25日21:09

  1. 「コマンドラインからのみ使用できます」と誤解される可能性があります。ほとんどすべて(おそらくすべて?)のプログラミング言語が他のプログラム/コマンドを呼び出すことができます。したがって、引用されたコメントは不幸です。この場合sqlite、別のプログラムの呼び出しは、言語がすべてのプログラムにwrapper/ libraryを提供するよりもサポートされる可能性が高くなります(そこにあるプログラムの大部分の性質によって不完全になる傾向があるだけではありません)だけでなく、反対作用single-source principle、複雑化maintenance、世界のデータの混乱を助長します)。

1
SQLデータベースからデータを取得するプログラムを作成する人は、データベースにアクセスしてクエリを実行するために、プログラミング言語で利用できる適切なSQLドライバーを使用する必要があります。これは、データベースにアクセスする適切な方法です。アドホッククエリを提供するように設計されたコマンドラインプログラムをハッキングすることはお勧めしません。あなたの提案は深く誤解されています。アドホッククエリ用のコマンドラインプログラムは、データベースでクエリを実行するプログラムコードに最適なアクセスポイントではありません。SQLドライバーの使用は、「複雑なメンテナンス」ではありません。これがベストプラクティスです。
Medlock Perlman 2017年

それは悪くない、ライブラリに似ています。Linux | BSDディストリビューションがパッケージマネージャーを出荷するのはこのためです。そして、なぜクロスプラットフォームPMがインストールされていないのか。私のポイントは、すべてのプログラムがラッパーを必要とするわけではないことを明確にすることでした。毎回意味がありません。もちろんこの場合(DB処理)、ラッパーを使用することは悪い考えではありません。
Radagast 2017年

1

グラフィカルツールを使用している場合。テーブル名のすぐ横にスキーマが表示されます。Sqlite DBブラウザーの場合は、データベース(右上隅)をクリックして開き、データベースに移動して開くと、次の表に情報が表示されます。

ここに画像の説明を入力してください

record / table_nameを右クリックし、copy createステートメントをクリックすると、それが表示されます。

コマンドラインでの作業に失敗した初心者に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.