sql - Postgres 索引创建 - 索引字段名称上的单引号
问题描述
使用 Postgres 10.11。
表架构:
create table "db"."table"
(
id varchar(4096) not null
constraint "db-table_pkey"
primary key,
etag varchar(255) not null,
jsondata jsonb not null
);
我们发现不小心创建了这样的索引:
create index "something"
on "db"."table" (('id'::text),
(jsondata -> 'someOtherField'::text),
((jsondata -> 'someOtherField2'::text) = 'false'::jsonb));
而且这个查询不会使用上面的索引:
select *
FROM "db"."table"
where jsonData->'someOtherField' = '"value"'
AND jsonData->'someOtherField2' = 'false'
AND id = 'testid'
order by id
limit 5
像这样重新制作索引解决了这个问题:
create index "something"
on "db"."table" ((id), -- JUST ID!!!
(jsondata -> 'someOtherField'::text),
((jsondata -> 'someOtherField2'::text) = 'false'::jsonb));
似乎我们不应该在索引列名称上使用单引号。谁能告诉我第一部分的索引是什么?它只是在“id”字符串常量上制作的吗?我什至可以用任何查询触发该索引吗?还是它们是相同的索引?
解决方案
似乎我们不应该在索引列名称上使用单引号。
你的直觉是对的。
'id'
是一个字符串常量,所以如果你索引它,所有索引条目都将具有相同的常量值。这样的索引是非常没用的(尽管有常量索引的部分或唯一索引的用例)。
要引用列,您必须使用 unquotedid
或 double quotes "id"
。
该文档对此有一整章。
推荐阅读
- c# - 尝试在 C# 中更新数据不起作用
- c# - 有没有办法在显示工具提示文本后触发回调?
- javascript - VueJS项目的选择选项中不显示选择的值
- c - 检查是一个数字是另一个数字的一部分
- javascript - Javascript 属性说未定义
- javascript - lodash omitBy 用于嵌套对象
- c++ - 空闲堆 esp32,字符串格式化程序
- flutter - Flutter:网页加载完成后如何从 url 获取响应?
- python - 从另一个数据框中的数据框中查找一个值并打印该行(Python)
- javascript - 在静态文件夹中的 Flask 应用程序中使用 nodejs 应用程序失败并出现相对导入