IBM DB2
C:\>db2 create table public.tab1 (id int not null, col1 int not null)
C:\>db2 create unique index tab1_ix on public.tab1 (id) include (col1)
C:\>db2 alter table public.tab1 add primary key (id)
SQL0598W Existing index "IN1139.TAB1_IX" is used as the index for the primary
key or a unique key. SQLSTATE=01550
这只是信息,已使用现有索引。
后GRESQL
db=# create table public.tab1 (id int not null, col1 int not null);
db=# create unique index tab1_ix on public.tab1 (id) include (col1);
db=# alter table public.tab1 add primary key (id);
db=# \d public.tab1;
Table "public.tab1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | not null |
col1 | integer | | not null |
Indexes:
"tab1_pkey" PRIMARY KEY, btree (id)
"tab1_ix" UNIQUE, btree (id) INCLUDE (col1)
PostgreSQL为主键创建了附加索引。
为什么这很重要?a)在解释的许多情况下,我看到如果创建了主键,那么数据库将使用主键索引进行查询。但是,如果我删除主键,则唯一索引和查询运行得更快(因为仅索引扫描)。b) 额外的磁盘空间用于额外的主键索引。c) 每次更新/插入/删除并且必须更新两个索引而不是一个。
问题:
- 当在具有现有唯一索引的表上添加主键时(例如在 IBM Db2 中),有没有办法强制 PostgreSQL 数据库使用现有索引?
- 有没有办法可以强制 PostgreSQL 在执行查询时使用唯一索引(因此使用仅索引扫描)而不是主键索引(并且仅使用索引扫描)?
PostgreSQL 不会自动使用现有的唯一索引作为主键;你必须自己做:
当然,您也可以不首先创建索引,因为主键将添加自己的索引,如您所见。