Topik ini menjelaskan cara menentukan dalam database OTOMATIS apakah kunci utama sebuah tabel bersifat global atau lokal, serta apakah kunci unik sebuah tabel bersifat global atau lokal.
Kunci utama
Dalam PolarDB-X, kunci utama mencakup kunci utama global dan kunci utama lokal.
Jika sebuah kunci utama secara global unik, maka itu adalah kunci utama global.
Jika sebuah kunci utama unik di dalam partisi, maka itu adalah kunci utama lokal.
Tabel biasa dan tabel siaran
Kunci utama dalam tabel biasa atau tabel siaran adalah kunci utama global karena bersifat unik secara global.
Contoh 1: Kunci utama global dalam tabel biasa dan tabel siaran
## Sebuah tabel biasa
CREATE TABLE single_tbl(
id bigint NOT NULL AUTO_INCREMENT,
name varchar(30),
PRIMARY KEY(id)
) SINGLE;
## Sebuah tabel siaran
CREATE TABLE brd_tbl(
id bigint NOT NULL AUTO_INCREMENT,
name varchar(30),
PRIMARY KEY(id)
) BROADCAST;Tabel terpartisi
Dalam database OTOMATIS, jika Anda tidak menentukan kunci partisi atau algoritma partisi saat membuat tabel, tabel terpartisi otomatis akan dibuat. Jika Anda menentukan kunci partisi atau algoritma partisi saat membuat tabel, tabel terpartisi manual akan dibuat.
Tabel terpartisi otomatis
Semua kunci utama dalam tabel terpartisi otomatis adalah kunci utama global karena bersifat unik secara global.
Contoh 2: Sebuah kunci utama global dalam tabel terpartisi otomatis
## Sebuah tabel terpartisi otomatis
CREATE TABLE auto_tbl(
id bigint NOT NULL AUTO_INCREMENT,
name varchar(30),
PRIMARY KEY(id)
);Tabel terpartisi manual
Kunci Utama Global
Dalam tabel terpartisi manual, jika kolom kunci utama mencakup semua kolom kunci partisi, kunci utamanya adalah kunci utama global karena bersifat unik secara global.
Contoh 3: Sebuah kunci utama global dalam tabel terpartisi manual
Kolom kunci utama dari tabel key_tbl adalah (id, name, addr), yang mencakup semua kolom kunci partisi (id, addr). Oleh karena itu, kunci utama tabel tersebut adalah kunci utama global karena bersifat unik secara global.
CREATE TABLE key_tbl(
id bigint,
name varchar(10),
addr varchar(30),
PRIMARY KEY(id, name, addr)
) PARTITION BY KEY(id, addr);Kunci Utama Lokal
Dalam tabel terpartisi manual, jika kolom kunci utama tidak mencakup semua kolom kunci partisi, kunci utamanya adalah kunci utama lokal.
Contoh 4: Sebuah kunci utama lokal dalam tabel terpartisi manual
Kolom kunci partisi city dari tabel list_tbl tidak termasuk dalam kolom kunci utama. Oleh karena itu, kunci utama tabel tersebut adalah kunci utama lokal karena hanya unik di dalam partisi, tetapi tidak unik secara global.
CREATE TABLE list_tbl(
order_id bigint,
city varchar(50),
name text,
PRIMARY KEY(order_id)
) PARTITION BY LIST(city)
(
PARTITION p1 VALUES IN ("Beijing"),
PARTITION p2 VALUES IN ("Shanghai"),
PARTITION p3 VALUES IN ("Guangzhou"),
PARTITION p4 VALUES IN ("Shenzhen"),
PARTITION p5 VALUES IN(DEFAULT)
);Contoh 5: Sebuah kunci utama lokal tidak unik secara global
Kunci utama lokal hanya unik di dalam partisi, tetapi tidak unik secara global. Oleh karena itu, kunci utama duplikat mungkin terjadi. Tabel list_tbl di Contoh 4 digunakan di sini. Kolom city adalah kolom kunci partisi dalam tabel. Oleh karena itu, data dalam kolom city disimpan di partisi yang berbeda.
Masukkan satu baris ke dalam tabel list_tbl. Setelah pernyataan dieksekusi, data disimpan di partisi p1.
INSERT INTO list_tbl(order_id, city, name) VALUES (10001, "Beijing", "phone"); Query OK, 1 row affectedMasukkan satu baris dengan nilai order_id yang sama dan nilai city yang sama ke dalam tabel list_tbl. Karena nilai city sama, baris tersebut diharapkan disimpan di partisi p1. Saat pernyataan dieksekusi, baris tersebut tidak dapat dimasukkan dan kesalahan konflik kunci utama dilaporkan. Baris dengan nilai kunci utama yang sama tidak dapat disimpan di partisi yang sama. Ini menunjukkan bahwa kunci utama lokal hanya bisa unik di dalam partisi.
INSERT INTO list_tbl(order_id, city, name) VALUES (10001, "Beijing", "book"); (1062, "ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] Error occurs when execute on GROUP 'TEST_DB_P00000_GROUP' ATOM 'dskey_test_db_p00000_group#polardbx-storage-0-master#11.167.60.147-1766#test_db_p00000': Duplicate entry '10001' for key 'PRIMARY' ")Masukkan satu baris dengan nilai order_id yang sama tetapi nilai city yang berbeda (Shanghai) ke dalam tabel list_tbl. Baris tersebut diharapkan disimpan di partisi p4. Pernyataan dieksekusi. Dua baris dengan kunci utama yang sama ada dalam tabel list_tbl. Ini menunjukkan bahwa kunci utama lokal tidak unik secara global.
INSERT INTO list_tbl (order_id, city, name) VALUES (10001, "Shenzhen", "camera"); Query OK, 1 row affected SELECT * FROM list_tbl; +----------+----------+--------+ | order_id | city | name | +----------+----------+--------+ | 10001 | Beijing | phone | | 10001 | Shenzhen | camera | +----------+----------+--------+ 2 rows in set
Contoh 6: Jika Anda menjalankan pernyataan DDL pada tabel yang memiliki kunci utama duplikat, kesalahan konflik kunci utama mungkin dilaporkan.
Karena kunci utama lokal duplikat mungkin digunakan dalam tabel, kesalahan konflik kunci utama mungkin dilaporkan ketika Anda melakukan operasi terkait redistribusi data pada tabel, seperti pernyataan DDL untuk memodifikasi kebijakan partisi atau menyinkronkan tabel ke komponen hilir.
Tabel list_tbl di Contoh 5 digunakan di sini. Tabel tersebut sudah memiliki dua baris dengan kunci utama yang sama. Satu baris disimpan di partisi dengan nilai city Beijing, dan baris lainnya disimpan di partisi dengan nilai city Shenzhen. Jalankan pernyataan DDL berikut untuk memodifikasi kebijakan partisi sehingga baris dengan nilai city Beijing dan Shenzhen disimpan di partisi yang sama. Pernyataan DDL gagal dan kesalahan konflik kunci utama dilaporkan. Ini karena pernyataan DDL ini mencoba menyimpan baris dengan kunci utama duplikat di partisi yang sama, yang melanggar aturan bahwa kunci utama lokal harus unik di dalam partisi.
ALTER TABLE list_tbl
PARTITION BY LIST (city)
(
PARTITION p1 VALUES IN ("Beijing", "Shenzhen"),
PARTITION p2 VALUES IN ("Shanghai"),
PARTITION p3 VALUES IN ("Guangzhou"),
PARTITION p5 VALUES IN(DEFAULT)
);
(4700, "ERR-CODE: [TDDL-4700][ERR_SERVER] server error by Failed to execute the DDL task. Caused by: ERR-CODE: [TDDL-5321][ERR_GLOBAL_SECONDARY_INDEX_BACKFILL_DUPLICATE_ENTRY] Duplicated entry '10001' for key 'PRIMARY' ")Metode berikut dapat digunakan untuk menghindari konflik kunci utama lokal ketika tabel menggunakan kunci utama lokal:
Gunakan atribut AUTO_INCREMENT untuk memungkinkan PolarDB-X menghasilkan kunci utama.
Anda tidak menentukan nilai kunci utama secara manual.
PentingJika tabel yang menggunakan kunci utama lokal sudah memiliki kunci utama duplikat, Anda harus menghindari konflik kunci utama ketika menyinkronkan data ke komponen hilir. Misalnya, ketika Anda menyinkronkan tabel yang menggunakan kunci utama lokal ke AnalyticDB for MySQL menggunakan DTS dan jika AnalyticDB for MySQL menggunakan kunci utama dari tabel PolarDB-X, konflik kunci utama mungkin terjadi. Dalam hal ini, kami sarankan Anda menetapkan kunci utama AnalyticDB for MySQL ke seluruh set kolom kunci utama dan kolom kunci partisi dari tabel PolarDB-X.
Kunci unik
Mirip dengan kunci utama, kunci unik dalam PolarDB-X mencakup kunci unik global dan kunci unik lokal.
Jika sebuah kunci unik secara global unik, maka itu adalah kunci unik global.
Jika sebuah kunci unik unik di dalam partisi, maka itu adalah kunci unik lokal.
Tabel biasa dan tabel siaran
Kunci unik dalam tabel biasa atau tabel siaran adalah kunci unik global karena bersifat unik secara global.
Contoh 7: Kunci unik global dalam tabel biasa dan tabel siaran
## Sebuah tabel biasa
CREATE TABLE single_tbl(
serial_id bigint,
name varchar(30),
UNIQUE KEY(serial_id)
) SINGLE;
## Sebuah tabel siaran
CREATE TABLE brd_tbl(
serial_id bigint,
name varchar(30),
UNIQUE KEY(serial_id)
) BROADCAST;Tabel terpartisi
Dalam database OTOMATIS, jika Anda tidak menentukan kunci partisi atau algoritma partisi saat membuat tabel, tabel terpartisi otomatis akan dibuat. Jika Anda menentukan kunci partisi atau algoritma partisi saat membuat tabel, tabel terpartisi manual akan dibuat.
Tabel terpartisi otomatis
Semua kunci unik dalam tabel terpartisi otomatis adalah kunci unik global karena bersifat unik secara global.
Contoh 8: Sebuah kunci unik global dalam tabel terpartisi otomatis
## Sebuah tabel terpartisi otomatis
CREATE TABLE auto_tbl(
serial_id bigint,
name varchar(30),
UNIQUE KEY(serial_id)
);Tabel terpartisi manual
Kunci Unik Global
Dalam tabel terpartisi manual, jika kolom kunci unik mencakup semua kolom kunci partisi, kunciuniknya adalah kunci unik global karena bersifat unik secara global.
Contoh 9: Sebuah kunci unik global dalam tabel terpartisi manual
Kolom kunci unik dari tabel hash_tbl adalah (inner_id, type_id), yang mencakup semua kolom kunci partisi (type_id). Oleh karena itu, kunci unik tabel tersebut adalah kunci unik global karena bersifat unik secara global.
CREATE TABLE hash_tbl(
type_id int,
inner_id int,
UNIQUE KEY(inner_id, type_id)
) PARTITION BY HASH(type_id);Contoh 10: Sebuah kunci unik global yang terdiri dari indeks sekunder global unik dalam tabel terpartisi manual
Dalam tabel terpartisi manual, indeks sekunder global juga merupakan kunci unik global karena bersifat unik secara global. Tabel key_tbl berisi indeks sekunder global unik dari kolom indeks serial_id. Ini adalah kunci unik global karena memastikan bahwa kolom indeks serial_id unik secara global.
CREATE TABLE key_tbl(
type_id int,
serial_id int,
UNIQUE GLOBAL INDEX u_sid(serial_id) PARTITION BY HASH(serial_id)
) PARTITION BY HASH(type_id);Kunci Unik Lokal
Contoh 11: Sebuah kunci unik lokal dalam tabel terpartisi manual
Dalam tabel terpartisi manual, jika kolom kunci unik tidak mencakup semua kolom kunci partisi, kunciuniknya adalah kunci unik lokal.
Kolom kunci unik dari tabel range_tbl adalah serial_id dan tidak mencakup kolom kunci partisi order_time. Oleh karena itu, itu adalah kunci unik lokal karena hanya unik di dalam partisi, tetapi tidak unik secara global.
CREATE TABLE range_tbl(
id int primary key auto_increment,
serial_id int,
order_time datetime NOT NULL,
UNIQUE KEY(serial_id)
) PARTITION BY RANGE(order_time)
(
PARTITION p1 VALUES LESS THAN ('2022-12-31'),
PARTITION p2 VALUES LESS THAN ('2023-12-31'),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);Contoh 12: Sebuah kunci unik lokal tidak unik secara global
Kunci unik lokal hanya unik di dalam partisi, tetapi tidak unik secara global. Oleh karena itu, kunci unik duplikat mungkin terjadi.
Tabel range_tbl di Contoh 11 digunakan di sini. Masukkan satu baris ke dalam tabel range_tbl. Setelah pernyataan dieksekusi, data disimpan di partisi p1.
INSERT INTO range_tbl(serial_id, order_time) VALUES (20001, '2022-01-01'); Query OK, 1 row affectedMasukkan satu baris yang nilainya
serial_idsama dengan baris sebelumnya dan nilainyaorder_timeadalah 2022-01-02 ke dalam tabel range_tbl. Nilaiorder_timemenunjukkan bahwa baris tersebut masih diharapkan disimpan di partisi p1. Saat pernyataan dieksekusi, baris tersebut tidak dapat dimasukkan dan kesalahan konflik kunci unik dilaporkan. Baris dengan nilai kunci unik yang sama tidak dapat disimpan di partisi yang sama. Ini menunjukkan bahwa kunci unik lokal hanya bisa unik di dalam partisi.INSERT INTO info_tbl(serial_id, order_time) VALUES (20001, '2022-01-02'); (1062, "ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] Error occurs when execute on GROUP 'D25_000001_GROUP' ATOM 'dskey_d25_000001_group#polardbx-storage-1-master#11.167.60.147-1766#d25_000001': Duplicate entry '20001' for key 'serial_id' ")Masukkan satu baris yang nilainya
serial_idsama dengan baris sebelumnya dan nilainyaorder_timeadalah 2023-01-01 ke dalam tabel range_tbl. Nilaiorder_timemenunjukkan baris tersebut diharapkan disimpan di partisi p3. Pernyataan dieksekusi. Dua baris dengan kunci unik yang sama ada dalam tabel range_tbl. Ini menunjukkan bahwa kunci unik lokal tidak unik secara global.INSERT INTO range_tbl(serial_id, order_time) VALUES (20001, '2024-01-01'); Query OK, 1 row affected SELECT * FROM range_tbl; +----+-----------+---------------------+ | id | serial_id | order_time | +----+-----------+---------------------+ | 2 | 20001 | 2024-01-01 00:00:00 | | 1 | 20001 | 2022-01-01 00:00:00 | +----+-----------+---------------------+ 2 rows in set
Contoh 13: Jika Anda menjalankan pernyataan DDL pada tabel yang memiliki kunci unik duplikat, kesalahan konflik kunci unik mungkin dilaporkan.
Karena kunci unik lokal duplikat mungkin digunakan dalam tabel, kesalahan konflik kunci unik mungkin dilaporkan ketika Anda melakukan operasi terkait redistribusi data pada tabel, seperti pernyataan DDL untuk memodifikasi kebijakan partisi atau menyinkronkan tabel ke komponen hilir.
Tabel range_tbl di Contoh 12 digunakan di sini. Tabel tersebut sudah memiliki dua baris dengan nilai serial_id yang sama. Satu baris disimpan di partisi p1, dan baris lainnya disimpan di partisi p2. Jalankan pernyataan DDL berikut untuk mengubah tabel range_tbl dari tabel terpartisi manual menjadi tabel biasa. Ini memicu redistribusi data dalam tabel range_tbl.
ALTER TABLE range_tbl SINGLE;
(4700, "ERR-CODE: [TDDL-4700][ERR_SERVER] server error by Failed to execute the DDL task. Caused by: ERR-CODE: [TDDL-5321][ERR_GLOBAL_SECONDARY_INDEX_BACKFILL_DUPLICATE_ENTRY] Duplicated entry '200001' for key 'PRIMARY' ")Pernyataan DDL gagal dan kesalahan konflik kunci unik dilaporkan. Ini karena pernyataan DDL ini mencoba mengubah tabel range_tbl menjadi tabel biasa yang berisi kunci unik duplikat, yang melanggar aturan bahwa kunci unik harus unik dalam tabel biasa.
Untuk menghindari konflik kunci unik lokal ketika tabel menggunakan kunci unik lokal, Anda harus memastikan bahwa kunci unik lokal tidak duplikat.
Jika tabel yang menggunakan kunci unik lokal sudah memiliki kunci unik duplikat, kami sarankan Anda memodifikasi data sumber secara manual untuk menghindari konflik kunci unik ketika menyinkronkan data ke komponen hilir.
FAQ
Apakah pernyataan terpisah digunakan untuk membuat kunci utama global atau kunci unik global?
Tidak. Anda dapat menggunakan pernyataan MySQL yang sama untuk membuat kunci utama atau kunci unik. Pastikan bahwa kunci utama atau kunci unik yang Anda buat memenuhi persyaratan untuk kunci utama global atau kunci unik global.
Kunci utama lokal saat ini digunakan dalam tabel. Bagaimana saya bisa memastikan bahwa kunci utama lokal tersebut unik secara global?
Anda dapat menggunakan fitur urutan untuk menghasilkan kunci utama yang unik secara global. Untuk informasi lebih lanjut, lihat Urutan.