使用 SQLite 获取存在特定 ID 值的所有表的列表

Posted

技术标签:

【中文标题】使用 SQLite 获取存在特定 ID 值的所有表的列表【英文标题】:Get a list of all the tables a specific ID value exists in with SQLite 【发布时间】:2022-01-03 10:55:18 【问题描述】:

我正在使用 SQLite v3.31.1 和 python 3.7.9。

如何识别特定 id 值存在于哪些表中?我认为这样的东西在 mysql 中以“INFORMATION_SCHEMA”的形式存在,但我还没有找到 SQLite 替代方案。

我有一个表结构,它遵循我认为的“类表继承”。基本上,我有一个产品表,其中包含所有产品共有的属性,以及包含该类产品的特定属性的表。 “Products”主表包含一个作为主键的 id 列,在子表中用作外键。因此,产品表和子表中都存在特定项目,但其他地方都不存在(FTS 的一些虚拟表除外)。

我目前的解决方案是获取所有表名

SELECT tbl_name 
FROM sqlite_master 
WHERE type='table'

然后使用循环遍历表格

SELECT 1
FROM child_table
WHERE id = value

但似乎应该有更好的方法。

谢谢。

【问题讨论】:

这是要走的路,因为 SQLite 不支持动态 sql。 【参考方案1】:

虽然我最初发布的答案有效,但速度很慢。你可以在 python 中添加一个哈希映射,但是在重新构建哈希映射时它会很慢。

相反,我在我的 SQL 设置中使用触发器来创建包含相关信息的表。这有点脆弱,但对于大量搜索结果来说要快得多,因为数据库只查询一次,并且在数据库初始化时加载表。

我的例子,有一个名为 Products 的父表,它的主键为 id。

CREATE TABLE IF NOT EXISTS ThermalFuse (
  id INTEGER NOT NULL, 
  ratedTemperature INTEGER NOT NULL,
  holdingTemperature INTEGER NOT NULL,
  maximumTemperature INTEGER NOT NULL,
  voltage INTEGER NOT NULL,
  current INTEGER NOT NULL,

  FOREIGN KEY (id) REFERENCES Product (id)
);

CREATE TABLE IF NOT EXISTS Table_Hash (
  id INTEGER NOT NULL,
  table_name TEXT NOT NULL,
  FOREIGN KEY (id) REFERENCES Product (id)
);

CREATE TRIGGER ThermalFuse_ai AFTER INSERT ON ThermalFuse
BEGIN
    INSERT INTO Table_Hash (id, table_name)
    VALUES (new.id, 'ThermalFuse');
END;

【讨论】:

以上是关于使用 SQLite 获取存在特定 ID 值的所有表的列表的主要内容,如果未能解决你的问题,请参考以下文章

在 sqlite 查询中如何获取具有所需值的特定行和列

如何使用 Diesel 和 SQLite 获取新创建值的 id?

如何使用 Diesel 和 SQLite 获取新创建值的 id?

如何获取具有特定名称/值的所有变体ID

在两个表中获取特定值的最佳方法[重复]

SQLite查询选择另一个表中不存在的所有记录