Topik ini menjelaskan penerapan nilai default dalam berbagai skenario serta nilai default yang digunakan oleh Holo Client.
Skenario SQL
Dalam skenario SQL, jika suatu bidang dikonfigurasi dengan nilai default dan tidak ada nilai yang ditentukan untuk bidang tersebut dalam operasi penulisan atau pembaruan data, sistem secara otomatis mengisi nilai default tersebut. Contoh berikut disediakan sebagai referensi.
Buat tabel default_test dan tetapkan nilai default untuk kolom a dan b.
BEGIN;
CREATE TABLE default_test (
a int NOT NULL DEFAULT 2023,
b timestamptz DEFAULT '2023-11-17 10:11:33.276+08',
PRIMARY KEY (a)
);
COMMIT;Contoh 1: Tentukan nilai untuk Kolom a dan Kolom b. Nilai yang ditentukan akan menggantikan nilai default.
-- Tentukan nilai untuk Kolom a dan Kolom b yang telah dikonfigurasi nilai defaultnya. INSERT INTO default_test VALUES (1, NULL); -- Kueri data dari tabel. SELECT * FROM default_test;Hasil berikut dikembalikan:
a b 1 \NContoh 2: Tidak menentukan nilai untuk Kolom b. Sistem secara otomatis mengisi nilai default untuk Kolom b.
-- Tidak menentukan nilai untuk Kolom b. INSERT INTO default_test (a) VALUES (2); -- Kueri data dari tabel. SELECT * FROM default_test;Hasil berikut dikembalikan:
a b 1 \N 2 2023-11-17 10:11:33.276+08Contoh 3: Jalankan pernyataan
INSERT ON DO NOTHING. Dalam pernyataan ini, tidak ada nilai yang ditentukan untuk Kolom a yang berfungsi sebagai kolom kunci primer. Dalam kasus ini, sistem menulis data yang ditentukan ke Kolom b dan secara otomatis mengisi nilai default di Kolom a.-- Jalankan pernyataan INSERT ON DO NOTHING. Dalam pernyataan ini, tidak ada nilai yang ditentukan untuk Kolom a yang berfungsi sebagai kolom kunci primer. Dalam kasus ini, sistem menulis data yang ditentukan ke Kolom b dan secara otomatis mengisi nilai default di Kolom a. INSERT INTO default_test (b) VALUES ('2023-11-18 10:11:33.276+08') ON CONFLICT (a) DO NOTHING; -- Kueri data dari tabel. SELECT * FROM default_test;Hasil berikut dikembalikan:
a b 2 2023-11-17 10:11:33.276+08 2023 2023-11-18 10:11:33.276+08 1 \NContoh 4: Jalankan pernyataan
INSERT ON CONFLICT DO UPDATE. Dalam pernyataan ini, nilai ditentukan untuk Kolom a dan Kolom b. Nilai yang ditentukan menggantikan nilai default.-- Jalankan pernyataan INSERT ON CONFLICT DO UPDATE. Dalam pernyataan ini, nilai ditentukan untuk Kolom a dan Kolom b. Nilai yang ditentukan menggantikan nilai default. INSERT INTO default_test (a, b)VALUES (2,null ) ON CONFLICT (a) DO UPDATE SET (a,b) = ROW(EXCLUDED.*); -- Kueri data dari tabel. SELECT * FROM default_test;Hasil berikut dikembalikan:
a b 1 \N 2023 2023-11-18 10:11:33.276+08 2 \NContoh 5: Jalankan pernyataan
INSERT ON CONFLICT DO UPDATE. Dalam pernyataan ini, nilai ditentukan untuk Kolom b dan menggantikan nilai default. Nilai di Kolom a tidak diperbarui.-- Jalankan pernyataan INSERT ON CONFLICT DO UPDATE. Dalam pernyataan ini, nilai ditentukan untuk Kolom b dan nilai tersebut menggantikan nilai default. Nilai di Kolom a tidak diperbarui. INSERT INTO default_test (a, b) VALUES (2023,null)ON CONFLICT (a) DO UPDATE SET b = EXCLUDED.b; -- Kueri data dari tabel. SELECT * FROM default_test;Hasil berikut dikembalikan:
a b 2 \N 1 \N 2023 \N
Menggunakan Flink untuk Menulis Data ke Hologres
Mode JDBC
Data berikut tidak ditulis selama prosedur penulisan data Flink:
Bidang nullable
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem mengisi Null untuk bidang tersebut.
Jika nilai default dikonfigurasikan untuk suatu bidang dan parameter mutatetype diatur ke InsertOrUpdate, sistem mengisi nilai default untuk bidang tersebut. Jika tidak, sistem mengisi Null untuk bidang tersebut.
Bidang non-null
Tidak ada nilai default yang ditetapkan:
Jika parameter EnableDefaultForNotNullColumn diatur ke false, sistem menampilkan pesan error alih-alih mengisi nilai default.
Jika parameter EnableDefaultForNotNullColumn diatur ke true, Holo Client mengisi nilai default berdasarkan tipe data. Contoh: string kosong
("").
Nilai default ditetapkan:
Jika parameter `EnableDefaultForNotNullColumn` diatur ke `false`, mesin Hologres akan menghitung dan menulis nilai default. Namun, pada versi Hologres sebelum V2.0, hal ini dapat mencegah penggunaan rencana tetap dan menyebabkan masalah performa.
CatatanAnda dapat melakukan upgrade instans Hologres secara manual atau bergabung ke kelompok DingTalk Hologres untuk mengajukan permohonan upgrade. Untuk informasi selengkapnya, lihat bagian "Manual upgrade" dalam Upgrade an instance dan Obtain online support for Hologres.
Jika parameter EnableDefaultForNotNullColumn diatur ke true, Holo Client mengisi nilai default berdasarkan tipe data.
Mode Penyalinan Tetap
Hanya operasi UPDATE dan IGNORE yang dapat dilakukan dalam mode ini. Jika Anda menentukan untuk memperbarui bidang tertentu, hanya nilai bidang yang ditentukan yang diperbarui. Nilai bidang lainnya tetap tidak berubah. Untuk mencapai efek REPLACE, Anda harus mendeklarasikan semua bidang dalam pernyataan Flink DDL. Aturan berikut berlaku untuk bidang yang tidak memiliki nilai yang ditentukan:
Bidang nullable
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem mengisi Null untuk bidang tersebut.
Jika nilai default dikonfigurasikan untuk suatu bidang, sistem mengisi nilai default untuk bidang tersebut.
Bidang non-null
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem menampilkan pesan error.
Nilai default ditetapkan.
Mode BulkLoad (HQEcopy)
Operasi UPDATE tidak dapat dilakukan dalam mode ini. Jika Anda hanya menentukan nilai untuk bidang tertentu saat menulis data ke Hologres, aturan berikut berlaku untuk bidang yang tidak memiliki nilai yang ditentukan:
Bidang nullable
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem mengisi Null untuk bidang tersebut.
Jika nilai default dikonfigurasikan untuk suatu bidang, sistem mengisi nilai default untuk bidang tersebut.
Bidang non-null
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem menampilkan pesan error.
Jika nilai default dikonfigurasikan untuk suatu bidang, sistem mengisi nilai default tersebut.
Untuk informasi selengkapnya tentang mode yang didukung untuk menulis data ke Hologres menggunakan Flink, lihat Hologres.
Menggunakan Data Integration dari DataWorks untuk Menulis Data ke Hologres
Sinkronisasi Batch Berbasis DataX
Anda dapat menggunakan DataX dari Data Integration untuk melakukan sinkronisasi batch dari tabel atau database. Untuk informasi selengkapnya, lihat Sumber data Hologres. Saat menggunakan Data Integration dari DataWorks, mode JDBC digunakan secara otomatis. Jika Anda hanya menentukan nilai untuk bidang tertentu saat menulis data ke Hologres, aturan berikut berlaku untuk bidang yang tidak memiliki nilai yang ditentukan:
Bidang nullable
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem mengisi Null untuk bidang tersebut.
Nilai default telah ditetapkan.
Jika parameter conflictMode diatur ke Replace, sistem mengisi Null untuk bidang tersebut.
Jika parameter conflictMode diatur ke Update, sistem mengisi nilai default untuk bidang tersebut.
Bidang non-null
Tidak ada nilai default yang ditetapkan.
Jika parameter default.enable diatur ke nilai default true, Holo Client mengisi nilai default berdasarkan tipe data untuk bidang tersebut. Contoh: string kosong
("")atau 0.Jika parameter default.enable diatur ke false, sistem menampilkan pesan error.
Nilai default dikonfigurasikan.
Jika parameter default.enable diatur ke nilai default true, sistem mengisi nilai default untuk bidang tersebut.
Jika parameter default.enable diatur ke false, sistem tetap mengisi nilai default untuk bidang tersebut. Pada versi Hologres sebelum V2.0, fixed plan mungkin gagal digunakan dan masalah performa dapat terjadi.
Sinkronisasi Real-time Berbasis StreamX
Anda dapat menggunakan StreamX dari Data Integration untuk melakukan sinkronisasi real-time dari tabel. Untuk informasi selengkapnya, lihat Sumber data Hologres. Saat menggunakan Data Integration dari DataWorks, mode JDBC digunakan secara otomatis. Jika Anda menentukan nilai untuk bidang tertentu saat menulis data ke Hologres, aturan berikut berlaku untuk bidang yang tidak memiliki nilai yang ditentukan:
Bidang nullable
Jika tidak ada nilai default yang dikonfigurasikan untuk suatu bidang, sistem mengisi Null untuk bidang tersebut.
Nilai default telah dikonfigurasikan sebelumnya.
Jika parameter conflictMode diatur ke Replace atau Ignore, sistem mengisi Null untuk bidang tersebut.
Jika parameter conflictMode diatur ke Update, sistem mengisi nilai default untuk bidang tersebut.
Bidang non-null
Nilai default tidak ditetapkan.
Jika parameter default.enable diatur ke nilai default true, Holo Client mengisi nilai default berdasarkan tipe data untuk bidang tersebut. Contoh: string kosong
("")atau 0.Jika parameter default.enable diatur ke false, sistem menampilkan pesan error.
Nilai default ditetapkan.
Jika parameter default.enable diatur ke nilai default true, sistem mengisi nilai default untuk bidang tersebut.
Jika parameter default.enable diatur ke false, sistem tetap mengisi nilai default untuk bidang tersebut. Pada versi Hologres sebelum V2.0, fixed plan mungkin gagal digunakan dan masalah performa dapat terjadi.
CatatanAnda dapat melakukan upgrade instans Hologres secara manual atau bergabung dengan grup DingTalk Hologres untuk mengajukan permintaan upgrade. Untuk informasi selengkapnya, lihat bagian "Manual upgrade" dalam Upgrade an instance dan Obtain online support for Hologres.
Tabel Pemetaan Nilai Default Holo-Client
Jika Anda menggunakan Flink atau Data Integration dari DataWorks yang terhubung melalui konektor Hologres untuk menulis data ke Hologres dalam mode JDBC, Holo Client digunakan. Jika Anda menentukan nilai untuk bidang tertentu saat menulis data, parameter default.enable secara otomatis diatur ke true (enableDefaultForNotNullColumn). Jika tidak ada nilai yang ditentukan untuk suatu bidang dan tidak ada nilai default yang dikonfigurasikan untuk bidang tersebut, Holo Client mengisi nilai default berdasarkan tipe data. Tabel berikut menjelaskan pemetaan antara nilai default dan tipe data.
Type | Pengisian Nilai Default Otomatis oleh Holo-Client |
SMALLINT | 0 |
INTEGER | |
BIGINT | |
REAL | 0.0 |
DOUBLE PRECISION | |
DECIMAL | 0 |
BOOLEAN | false |
VARCHAR(n) | "" |
CHAR(n) | |
TEXT | |
TIMESTAMPTZ | 1970-01-01 08:00:00 |
TIMESTAMP | |
DATE | 1970-01-01 |
TIMETZ | 08:00:00 |
TIME | |
JSON dan JSONB | Anda tidak dapat menulis Nilai Default. |
BYTEA | |
RoaringBitmap | |
BIT(n) | |
VARBIT(n) | |
INTERVAL |