当前位置: 首页 > 面试题库 >

sqlite中的复合主键

颛孙炜
2023-03-14
问题内容

PRIMARY KEY(col1, col2)

创建一个名为“ sqlite_autoindex_mytable_1”的索引。我在“ SQlite
Expert”中看到了它。在“要索引的字段”框中,它同时显示col1和col2。

在这篇文章中:https :
//dba.stackexchange.com/a/14260
它说如果我想在没有col1的JOIN查询中使用col2,则必须为col2创建单独的索引。

因此,我需要添加:

CREATE INDEX "myidx" ON "mytable"("col2");

如果我有此查询:

SELECT t2.* FROM mytable as t1 
INNER JOIN mytable2 as t2 ON t1.col2 = t2.id

我仍然需要col2的索引吗?我没有用col1它。

那这个查询呢:

SELECT t2.* FROM mytable as t1 
INNER JOIN mytable2 as t2 ON t1.col2 = t2.id WHERE t1.col1 = x

在这里我使用col1,但是在where子句中。它仍然需要col2索引吗?


问题答案:
  • 在SQLite中,联接是作为 嵌套循环联接实现的 ,即SQLite遍历一个表的所有(可能是过滤的)记录,并针对每个表在另一表中查找匹配的记录。选择两个连接表中的哪一个作为外部表还是内部表取决于估计的查找速度。
  • 在查询中,SQLite每张表最多使用一个索引。
  • 仅当使用了所有最左边的列时,才可以将多列索引用于其子集的查找。例如,您的col1,col2索引可用于同时使用col1和的查找,也可用于col2仅使用的查找col1

在您的第一个查询中,两列索引不能用于在上进行查找col2。如果id另一个表的列具有索引,SQLite只会将该表用作循环的内部表。如果id也未建立索引,则SQLite可能会为此查询创建一个临时索引。

在第二个查询中,SQLite可能t1用作外部表,因为WHERE过滤器将减少必须在另一个表中查找的记录数。两列索引可用于首先搜索匹配col1记录;然后将这些记录中的每一个都与连接在一起t2

要检查查询使用了哪些索引(如果有),请执行EXPLAIN QUERY PLAN。



 类似资料:
  • EmbeddedId或IdClass注释用于表示复合主键。如何在没有(EmbeddedId或IdClass)的情况下使用复合主键? 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么如何使用EntityManager.find(Entity Class,Object primaryKey)方法在复合主键(Multiple primaryKey)的情况下查找实体(因为没

  • 问题内容: 我有一个具有复合主键的旧式数据库表。我认为我无法更改结构以包含代理键,因为编写了一些使用该表的代码。在django中,我无法使用该表,因为它没有主键(非复合键)。 Django模型是否支持复合主键?如果不是,是否有任何解决方法而不更改表的结构? PS我正在使用PostgreSQL。 问题答案: 试试下面类似的代码: 或者,如果你只想要唯一的混合字段: 编辑:我想指出,如果有3列,则此方

  • 问题内容: 我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。 作为示例,请考虑说明该问题的下表: 请注意,尽管每个来源的唯一,但有可能在不同来源中找到相同的来源。 我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。

  • 问题内容: 我的JPA模型中有以下类(省略了getters,setters和无关字段): 我需要定义一个类,使得当从所述类生成DDL时,相应的表的主键被由密钥和。我尝试了以下方法: 但这会为表生成以下内容: 请注意,和都是可为空的,当我尝试将DDL加载到SQL Server时会导致以下错误 无法在表“ PRICE”中的可为空的列上定义PRIMARY KEY约束 我不明白为什么这些可以为空,因为在域

  • 我在使用复合主键的hibernate实体集时遇到了问题。 我们的应用程序中有一个概念“Target”。目标id应该是其他三个表(实体)主id的组合。目标也有一个int标记。员工应该有一系列目标。SQL如下所示: 这个SQL工作正常,它允许我每个role_id(员工)多个目标,只要应用程序和项目分类不同。 这是目标ID类 这是目标类 这是employee类,我想在其中为每个员工存储一组目标。 通过h

  • JFinal ActiveRecord 从 2.0 版本开始,采用极简设计支持复合主键,对于 Model 来说需要在映射时指定复合主键名称,以下是具体例子: ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); // 多数据源的配置仅仅是如下第二个参数指定一次复合主键名称 arp.addMapping("user_role",