是否有与 MySQL 的 DESCRIBE [表] 等效的 SQLite?

Posted

技术标签:

【中文标题】是否有与 MySQL 的 DESCRIBE [表] 等效的 SQLite?【英文标题】:Is there an SQLite equivalent to MySQL's DESCRIBE [table]? 【发布时间】:2011-03-20 19:33:46 【问题描述】:

我刚刚开始学习SQLite。如果能够查看表的详细信息,例如 mysqlDESCRIBE [table],那就太好了。 PRAGMA table_info [table] 不够好,因为它只有基本信息(例如,它不显示列是否是某种类型的字段)。 SQLite 有办法做到这一点吗?

【问题讨论】:

【参考方案1】:

SQLite command line utility 有一个 .schema TABLENAME 命令显示创建语句。

【讨论】:

您可以在没有表格的情况下使用“.schema”,它会向您显示所有表格。 不要忘记在语句末尾省略分号 不需要分号 @Simon 分号将导致命令静默失败 @djeikyb。这不应该被认为是一个错误吗?【参考方案2】:

查看所有表格:

.tables

查看特定表格:

.schema [tablename]

【讨论】:

在 [方括号] 内提供表名不起作用。你必须给.schema TABLENAME @PayelSenapati 方括号只是表示tablename是可选参数。【参考方案3】:

您是否正在寻找用于生成表的 SQL?为此,您可以query the sqlite_schema table:

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

架构表始终可以使用名称sqlite_schema 来引用,尤其是在使用main.sqlite_schematemp.sqlite_schema 等架构名称限定的情况下。但为了历史兼容性,也可以识别一些替代名称,包括:

    sqlite_master sqlite_temp_schema sqlite_temp_master

备选方案 (2) 和 (3) 仅适用于与每个数据库连接关联的 TEMP 数据库,但备选方案 (1) 适用于任何地方。

【讨论】:

这和.schema foo有区别吗? @Matthew: .schema 只能从命令行使用;上述命令可以通过库(Python、C# 等)作为查询运行。 @MarkRushakoff 但结果是一样的吗? +1 "SELECT * FROM sqlite_master" 在调试 WebSql 时可在 Chrome 开发工具中使用【参考方案4】:
PRAGMA table_info([tablename]);

【讨论】:

对我来说,这似乎比 .schema tablename 更相当于 MySQL 的描述。 是的。这对我有用。 .schema TABLENAME 没有。然而,单独的 .schema 确实向您展示了所有创建语句,但如果我只想查看一张表,则 PRAGMA 的结果会更有用。 这似乎应该是公认的答案,因为它通过查询而不是依赖于命令行界面来工作。来自我的 +1。 附录:我唯一注意到的是,当我使用 INTEGER PRIMARY KEY 创建表时,它不输出 PRIMARY KEY,只是 INTEGER。 @AkoiMeexx:来自我原来的问题:“PRAGMA table_info [table] 不够好,因为它只有基本信息(例如,它不显示列是否是某种字段与否)。”【参考方案5】:

为防止人们被某些 cmets 误导到其他答案:

    如果.schemaquery from sqlite_master 没有给出任何输出,则表示不存在tablename,例如这也可能是由.schema.tables 的末尾的; 分号引起的,或者只是因为该表确实不存在。 .schema 不起作用的可能性很小,然后应该在 sqlite 项目中提交错误报告。

... .schema 只能在命令行中使用;上述命令 > 可以通过库(Python、C# 等)作为查询运行。 – Mark Rushakoff 2010 年 7 月 25 日 21:09

    “只能从命令行使用”可能会误导人们。几乎任何(可能每一种?)编程语言都可以调用其他程序/命令。因此,引用的注释是不幸的,因为调用另一个程序,在这种情况下 sqlite,比该语言为每个程序提供一个 wrapper/library 更有可能得到支持(这不仅容易导致不完整大量程序的本质,但也是反作用single-source principle,使maintenance复杂化,加剧了世界数据的混乱)。

【讨论】:

任何编写程序以从任何 SQL 数据库中检索数据的人都应使用其编程语言可用的适当 SQL 驱动程序来访问数据库并对其执行查询。这是访问数据库的适当方式。我绝不会建议破解旨在提供临时查询的命令行程序。你的建议大错特错。即席查询的命令行程序肯定不是程序代码在数据库上运行查询的最合适的访问点。使用 SQL 驱动程序肯定不会“使维护复杂化”——这是最佳实践。 我同意这还不错,它类似于图书馆。这就是 Linux|BSD 发行版发布包管理器的原因。以及为什么会有 0install 跨平台 PM。我的意思是澄清并非所有程序都需要包装器。不是每次都有意义。在这种情况下(数据库处理)当然使用包装器不是一个坏主意。【参考方案6】:

如果您使用的是图形工具。它在表名旁边显示架构。如果是 DB Browser For Sqlite,点击打开数据库(右上角),导航并打开您的数据库,您将看到表格中填充的信息为下面。

右键单击记录/表名,单击复制创建语句,就可以了。

希望它可以帮助一些无法使用命令行的初学者。

【讨论】:

以上是关于是否有与 MySQL 的 DESCRIBE [表] 等效的 SQLite?的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询一个列名都存在于哪些表

是否有与 MySql 等效的 Profiler? [关闭]

是否有与 Mysql 的“多语句查询”等效的 java

查看mysql数据表结构的两种方法你会吗?

是否有与 PHP 的 preg_replace 等效的 MySQL?

mysql5.5基础 describe 显示表的结构