All Products
Search
Document Center

PolarDB:Gunakan kolom apa pun dari tabel partisi sebagai primary key

Last Updated:Jan 14, 2026

Dalam PostgreSQL, primary key pada tabel partisi harus mencakup kunci partisi dan tidak dapat dirujuk oleh foreign key. PolarDB for PostgreSQL menghapus batasan ini. Anda dapat menggunakan kolom apa pun dari tabel partisi sebagai primary key dan merujuknya melalui foreign key.

Applicability

Fitur ini didukung pada kluster PolarDB for PostgreSQL yang menjalankan PostgreSQL 14 dengan versi mesin minor 2.0.14.10.17.0 atau lebih baru.

Catatan

Anda dapat melihat versi mesin minor di Konsol atau menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor kluster Anda tidak memenuhi persyaratan, upgrade versi mesin minor.

Parameter

polar_pk_in_non_partition_column_mode: Menentukan tipe indeks yang digunakan untuk primary key pada kolom non-partisi. Nilai yang valid:

  • none/local_pk: Primary key tidak dapat dibuat pada kolom non-partisi. Jika Anda mencoba melakukannya, sistem akan mengembalikan error.

  • global_index: Saat Anda membuat primary key pada kolom non-partisi, indeks global digunakan sebagai kendala.

Batasan

  • Jika primary key mencakup semua kunci partisi, indeks lokal digunakan sebagai primary key secara default. Jika tidak, indeks global digunakan sebagai primary key.

  • Jika Kendala UNIK mencakup semua kunci partisi, indeks lokal digunakan sebagai kendala unik secara default. Jika tidak, indeks global digunakan sebagai kendala unik.

  • Anda harus menggunakan indeks global saat menambahkan primary key ke tabel partisi yang sudah ada karena indeks lokal mungkin tidak memenuhi kendala tersebut. Aturan yang sama berlaku saat Anda menambahkan Kendala UNIK.

  • Anda tidak dapat memperbarui baris yang tersebar di beberapa partisi jika baris tersebut dirujuk oleh foreign key. Pembaruan lintas partisi setara dengan operasi penghapusan diikuti oleh operasi penyisipan. Saat sistem menghapus baris tersebut, sistem melakukan pemeriksaan foreign key.

Contoh

Atur polar_pk_in_non_partition_column_mode ke none dan buat primary key pada kolom non-partisi.

SET polar_pk_in_non_partition_column_mode = none;
CREATE TABLE pt1 (a int, b int primary key, c varchar) PARTITION BY RANGE(a);
ERROR:  unique constraint on partitioned table must include all partitioning columns
DETAIL:  PRIMARY KEY constraint on table "pt1" lacks column "a" which is part of the partition key.

Atur polar_pk_in_non_partition_column_mode ke global_index dan buat primary key pada kolom non-partisi.

SET polar_pk_in_non_partition_column_mode = global_index;
CREATE TABLE pt1 (a int, b int primary key, c varchar) PARTITION BY RANGE(a);
CREATE TABLE pt1_p1 PARTITION OF pt1 FOR VALUES FROM (0) TO (1);
\d pt1
               Partitioned table "public.pt1"
 Column |       Type        | Collation | Nullable | Default
--------+-------------------+-----------+----------+---------
 a      | integer           |           |          |
 b      | integer           |           | not null |
 c      | character varying |           |          |
Partition key: RANGE (a)
Indexes:
    "pt1_pkey" PRIMARY KEY, btree (b) GLOBAL
Number of partitions: 1 (Use \d+ to list them.)

Jika primary key dari tabel partisi mencakup semua kunci partisi, indeks lokal digunakan sebagai primary key terlepas dari nilai polar_pk_in_non_partition_column_mode. Ini adalah perilaku default PostgreSQL.

CREATE TABLE pt2 (a int primary key, b int, c varchar) PARTITION BY RANGE(a);
CREATE TABLE pt2_p1 PARTITION OF pt2 FOR VALUES FROM (0) TO (1);
\d pt2
               Partitioned table "public.pt2"
 Column |       Type        | Collation | Nullable | Default
--------+-------------------+-----------+----------+---------
 a      | integer           |           | not null |
 b      | integer           |           |          |
 c      | character varying |           |          |
Partition key: RANGE (a)
Indexes:
    "pt2_pkey" PRIMARY KEY, btree (a)
Number of partitions: 1 (Use \d+ to list them.)

Jika Anda harus menggunakan indeks global sebagai primary key, gunakan sintaks untuk memodifikasi primary key tabel tersebut.

ALTER TABLE pt2 DROP CONSTRAINT pt2_pkey;
CREATE UNIQUE INDEX pt2_pkey ON pt2 (a) GLOBAL;
ALTER TABLE pt2 ADD PRIMARY KEY USING INDEX pt2_pkey;
\d pt2
               Partitioned table "public.pt2"
 Column |       Type        | Collation | Nullable | Default
--------+-------------------+-----------+----------+---------
 a      | integer           |           | not null |
 b      | integer           |           |          |
 c      | character varying |           |          |
Partition key: RANGE (a)
Indexes:
    "pt2_pkey" PRIMARY KEY, btree (a) GLOBAL
Number of partitions: 1 (Use \d+ to list them.)