用于查找主键的SQLite查询

ukqbszuj  于 2022-11-30  发布在  SQLite
关注(0)|答案(3)|浏览(438)

在SQLite中,我可以运行以下查询来获取表中的列列表:

PRAGMA table_info(myTable)

这会提供列,但没有关于主键可能是什么的信息。此外,我可以运行以下两个查询来查找索引和外键:

PRAGMA index_list(myTable)
PRAGMA foreign_key_list(myTable)

但是我似乎不知道如何查看主键。有人知道我如何才能做到这一点吗?
注:我也知道我可以做:

select * from sqlite_master where type = 'table' and name ='myTable';

它会给予出显示主键的create table语句。但是我正在寻找一种不解析create语句就能做到这一点的方法。

6za6bjd0

6za6bjd01#

table_info DOES给予了一个名为pk(最后一个)的列,指示它是主键(如果是主键,则为它在键中的索引)还是非主键(零)。
从文件中澄清:
对于不属于主键的列,结果集中的“pk”列为零;对于属于主键的列,结果集中的“pk”列为主键中列的索引。

des4xlb0

des4xlb02#

希望这对某些人有所帮助:经过一番研究和努力,我找到主键列名的命令是:

SELECT l.name FROM pragma_table_info("Table_Name") as l WHERE l.pk = 1;
kognpnkq

kognpnkq3#

对于那些试图在android中检索pk名称的用户,以及在使用ROOM库时。
@Oogway101的answer抛出了一个错误:“没有这样的列[your_table_name]...等等...等等...
我提交查询方式是:

String pkSearch = "SELECT l.name FROM pragma_table_info(" + tableName + ") as l WHERE l.pk = 1;";
database.query(new SimpleSQLiteQuery(pkSearch)

我试着使用(“)引号,但仍然出错。

String pkSearch = "SELECT l.name FROM pragma_table_info(\"" + tableName + "\") as l WHERE l.pk = 1;";

所以我的解决方案是:

String pragmaInfo = "PRAGMA table_info(" + tableName + ");";

    Cursor c = database.query(new SimpleSQLiteQuery(pragmaInfo));
    String id = null;
    c.moveToFirst();
    do {
       if (c.getInt(5) == 1) {
          id = c.getString(1);
       }
    } while (c.moveToNext() && id == null);
    Log.println(Log.ASSERT, TAG, "AbstractDao: pk is: " + id);

其解释是:
A)PRAGMA table_info返回具有各种索引的游标,响应长度至少为6...未检查更多...
B)索引1具有列名。
C)索引5具有“pk”值,如果不是主键,则为0,如果是pk,则为1。
您可以定义多个pk,因此如果您的表有多个pk,这将不会带来准确的结果(恕我直言,多个pk是糟糕的设计,会使数据库的复杂性超出人类的理解范围)。
那么这将如何融入@道呢?(你可能会问...)
当使Dao“抽象”时,您可以访问其中包含数据库的默认构造函数:
从文件中:

An abstract @Dao class can optionally have a constructor that takes a Database as its only parameter.

这是将授予您对查询的访问权限的构造函数。
不过有一个问题...
您可以在数据库创建过程中通过.addCallback()方法使用Dao:

instance = Room.databaseBuilder(context.getApplicationContext(),
                    AppDatabase2.class, "database")
                    .addCallback(
                       //You may use the Daos here.
                    )
                    .build();

如果在Dao的构造函数中运行查询,数据库将进入无限示例化的反馈循环。
这意味着查询必须被轻松地使用(只是在用户需要的时候),因为值永远不会改变,所以它可以被存储,并且永远不会被重新查询。

相关问题