Topik ini menjelaskan cara menggunakan kolom wildcard melalui Lindorm SQL.
Informasi latar belakang
Pernyataan SQL tradisional hampir tidak dapat memenuhi kebutuhan bisnis dalam skenario di mana sejumlah besar data perlu diproses. Sebagai contoh, sebuah database mungkin berisi ratusan atau ribuan kolom non-tetap dalam skenario Internet of Vehicles (IoV). Untuk menulis kolom baru ke database, Anda harus mengeksekusi pernyataan ALTER TABLE yang tidak efisien.
Lindorm mendukung kolom dinamis yang memungkinkan Anda untuk menulis dan mengquery data secara dinamis. Namun, saat ini kolom dinamis hanya mendukung data VARBINARY. Untuk membantu Anda menulis lebih banyak jenis data ke kolom dinamis, Lindorm menyediakan kolom wildcard.
Nama dari kolom wildcard mendukung tanda bintang (*) dan tanda tanya (?) sebagai wildcard. Data dalam kolom yang namanya sesuai dengan wildcard akan dikonversi ke tipe yang ditentukan. Kedua wildcard tersebut menunjukkan karakter yang berbeda.
Tanda tanya (?) cocok dengan satu karakter.
Tanda bintang (*) cocok dengan urutan karakter yang bisa kosong.
Sebagai contoh, jika Anda menambahkan kolom wildcard bernama c* int ke skema tabel, Anda dapat menulis kolom apa pun yang namanya dimulai dengan karakter c, seperti c10, c11, atau c20. Tipe data dalam kolom-kolom ini akan dikonversi menjadi INT.
Prasyarat
Versi LindormTable adalah 2.5.3 atau lebih baru. Untuk informasi lebih lanjut tentang cara melihat atau meningkatkan versi LindormTable, lihat Catatan Rilis LindormTable dan Tingkatkan Versi Mesin Minor dari Instance Lindorm.
Batasan
Kolom wildcard tidak dapat ditentukan sebagai kunci utama.
Untuk menggunakan pernyataan
SELECT *untuk mengquery data dalam tabel yang berisi kolom wildcard, Anda harus menambahkan klausa LIMIT ke pernyataan tersebut. Contoh:SELECT * FROM t_dynamic_columns LIMIT 10;Hanya indeks pencarian yang dapat dibuat untuk kolom wildcard. Indeks sekunder tidak dapat dibuat untuk kolom wildcard. Sebagai contoh, pernyataan berikut tidak didukung:
CREATE INDEX idx on tb(c2*);Nama kolom yang mengandung wildcard tidak dapat digunakan sebagai kondisi untuk mengquery data. Hanya nama kolom aktual yang dapat digunakan sebagai kondisi dalam pernyataan SELECT dan klausa WHERE. Sebagai contoh, pernyataan berikut tidak didukung:
SELECT c1*, c2 WHERE c2 > 10;danSELECT c1*, c2 WHERE c1* > 10;. Pernyataan berikut didukung:SELECT pk, c1, c2, c21, c31 WHERE c21 > 10 AND c31 < 'c300';
DDL
Buat tabel dengan kolom wildcard
Anda dapat mengeksekusi pernyataan berikut untuk membuat tabel bernama tb, menentukan kolom pk sebagai kunci utama, dan menentukan dua kolom wildcard berikut dalam klausa WITH: c2* dan c3*. Tipe data kolom c2* adalah BIGINT dan tipe data kolom c3* adalah VARCHAR.
CREATE TABLE tb(pk INTEGER, c1 VARCHAR, `c2*` BIGINT, `c3*` VARCHAR, PRIMARY KEY(pk)) WITH(wildcard_column='c2*,c3*');Berdasarkan pernyataan di atas, jika nama kolom dimulai dengan c2 (seperti c2, c21, atau c22) dan tipe data kolom tersebut adalah BIGINT, kolom tersebut dapat ditulis ke tabel tb. Jika nama kolom dimulai dengan c2 dan tipe data kolom tersebut bukan BIGINT, kolom tersebut dapat ditulis ke tabel tb dan tipe data kolom tersebut akan dikonversi menjadi BIGINT. Demikian pula, jika nama kolom dimulai dengan c3 (seperti c32, c33, atau c35) dan tipe data kolom tersebut adalah VARCHAR, kolom tersebut dapat ditulis ke tabel tb. Jika nama kolom dimulai dengan c3 dan tipe data kolom tersebut bukan VARCHAR, kolom tersebut dapat ditulis ke tabel tb dan tipe data kolom tersebut akan dikonversi menjadi VARCHAR.
Buat indeks pencarian pada kolom wildcard
Indeks pencarian dapat dibuat untuk kolom wildcard. Anda dapat mengeksekusi pernyataan berikut untuk membuat indeks pencarian pada kolom wildcard c2* dan c3* dalam tabel tb. Semua kolom yang namanya sesuai dengan wildcard diindeks oleh indeks pencarian.
CREATE INDEX idx USING SEARCH ON tb(`c2*`, `c3*`);DML
Tulis data ke dalam kolom
Saat Anda menulis data ke kolom yang sesuai dengan kolom wildcard, kolom yang Anda tentukan dalam pernyataan harus memenuhi persyaratan berikut:
Nama kolom harus memenuhi aturan pencocokan yang ditentukan oleh kolom wildcard.
Tipe data kolom harus memenuhi tipe data yang ditentukan oleh kolom wildcard.
UPSERT INTO tb(pk, c1, c2, c21, c22, c31) VALUES (1, 'a1', 2, 21, 22, 'c3');