【问题标题】:Is there a way to order the result of a sqlite PRAGMA foreign_key_list() query by the order, the columns in the table the query is taken on, appear?有没有办法按顺序对 sqlite PRAGMA foreign_key_list() 查询的结果进行排序,出现查询的表中的列?
【发布时间】:2019-01-07 08:09:25
【问题描述】:

如果 sqlite 表的行数超过设置的限制大小,我想以编程方式向它添加索引。我想将索引添加到所有具有外键的列中,为了获得这些,我使用

PRAGMA foreign_key_list(myTable)

我使用from 列从我的表中获取具有外键的列。 由于具有多列的索引的顺序很重要,我想按照它们在表中出现的顺序对它们进行排序。有没有办法在这个PRAGMAquery(以及如何)中找到订单,还是我必须进行另一个查询(PRAGMA table_info(myTable))并以编程方式找到订单?

编辑:使用 .db3 文件。

【问题讨论】:

    标签: c# sqlite indexing pragma


    【解决方案1】:

    在进行了有限的测试后,如果外键是在列级别定义的,那么 id 列对于之前定义的外键来说是一个更高的值。

    您可以使用在 SELECT 语句中返回结果的编译指示,例如并根据其中一列进行排序(如果使用了合适的列命名约定,则使用了 id,您可以根据 from 栏目(注意需要附上))

    SELECT * FROM pragma_foreign_key_list('mytable') ORDER BY id ASC;
    

    例如考虑以下内容:-

    DROP TABLE IF EXISTS mytable;
    
    
    CREATE TABLE IF NOT EXISTS mytable (id INTEGER PRIMARY KEY,
      _otherd_building_id_reference INTEGER REFERENCES _building(_id),
        _building_id_reference INTEGER REFERENCES _building(_id),
        _room_id_reference INTEGER REFERENCES _room(_id),
        _campus_id_reference INTEGER REFERENCES _campus(_id),
        _othera_campus_reference INTEGER REFERENCES _campus(_id),
        _otherz_room_id_reference INTEGER REFERENCES _room(_id),
        _otherc_building_id_reference INTEGER REFERENCES _building(_id)
        );
    
    
    SELECT * FROM pragma_foreign_key_list('mytable') ORDER BY id DESC;
    
    • 请注意,最初添加的列没有像 *other? 这样的前缀,然后在末尾添加 othera,c 和 z,最后添加了 _otherd_building_id_reference。

    运行上面的结果是一致的:-

    【讨论】:

    • 在 select 语句中使用 pragma 也是我的第一个想法,但是(至少使用 SQLite 的 db 浏览器进行测试)它总是返回 no such table: pragma_foreign_key_list: SELECT * FROM pragma_foreign_key_list('mytable') ORDER BY id ASC; 错误。在我看来,.db3 数据库不支持这种事情?编辑:当然我用正确的替换了表名。
    • ...和select * from (pragma foreign_key_list('myTable'))一样
    • @RolandDeschain 刚刚用 DB Browser 检查(它不起作用,因为它似乎有一个相当低版本的 SQLite 3.10.1) 编译指示函数似乎已在 3.16.0 中引入(我通常使用 Navicat(以上是在 Navicat 中完成的))
    • 是的,刚刚使用命令行 shell 进行了测试,它正在那里工作,所以它也应该以编程方式工作。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2012-07-14
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多