Gunakan pernyataan CREATE TABLE untuk membuat tabel di LindormTable atau LindormTSDB. Pernyataan ini mendukung tipe data seperti VARCHAR, TIMESTAMP, dan BIGINT, serta properti tabel seperti time-to-live (TTL) dan algoritma kompresi.
Mesin dan versi
Pernyataan CREATE TABLE berlaku untuk LindormTable dan LindormTSDB.
LindormTSDB mendukung sintaks CREATE TABLE standar mulai dari versi 3.4.32. Untuk melihat atau melakukan upgrade versi mesin Anda, lihat Panduan versi LindormTSDB dan Pembaruan versi minor.
Sintaks
create_table_statement ::= CREATE TABLE [ IF NOT EXISTS ] table_identifier
'('
column_definition
( ',' column_definition )*
',' PRIMARY KEY '(' primary_key ')'
( ',' {KEY|INDEX} [index_identifier]
[ USING index_method_definition ]
[ INCLUDE column_identifier ( ',' column_identifier )* ]
[ WITH index_options ]
)*
')'
[ PARTITION BY partition_definition ]
[ ZORDER BY zorder_column_list ]
[ WITH table_options ]
column_definition ::= column_identifier data_type [ NOT NULL ]
primary_key ::= column_identifier [ ',' column_identifier (ASC|DESC)]
index_method_definition ::= { KV | SEARCH }
index_options ::= '('
option_definition (',' option_definition )*
')'
partition_definition ::= HASH '(' column_identifier (',' column_identifier )* ')'
zorder_column_list ::= column_identifier ( ',' column_identifier )*
table_options ::= '(' option_definition (',' option_definition )* ')'
option_definition ::= option_identifer '=' string_literalPerbandingan mesin
Sintaks CREATE TABLE berbeda antara LindormTable dan LindormTSDB.
| Elemen sintaks | LindormTable | LindormTSDB |
|---|---|---|
| Nama tabel (table_identifier) | Didukung | Didukung |
| Definisi kolom (column_definition) | Didukung | Didukung |
| Kunci primer (primary_key) | Didukung | Didukung |
| Ekspresi indeks (KEY|INDEX) | Didukung | Tidak didukung |
| Partisi (partition_definition) | Tidak didukung | Didukung |
| Properti tabel (table_options) | Didukung | Tidak didukung |
Catatan penggunaan
Nama tabel
Karakter yang diizinkan: angka, huruf kapital, huruf kecil, titik (
.), tanda hubung (-), dan garis bawah (_).Tidak boleh dimulai dengan titik (
.) atau tanda hubung (-).Panjang: 1 hingga 255 karakter.
Definisi kolom
| Elemen | Wajib | Catatan |
|---|---|---|
| Nama kolom | Ya | Karakter yang diizinkan: angka, huruf kapital/kecil, titik (.), tanda hubung (-), dan garis bawah (_). Tidak boleh menggunakan kata kunci yang dicadangkan. Panjang maksimum: 255 byte. |
| Tipe data | Ya | Untuk tipe data yang didukung, lihat Tipe data. |
| Kendala NULL | Tidak | Lihat catatan di bawah. |
Tipe TIMESTAMP (khusus LindormTSDB):
Hanya satu kolom per tabel yang boleh bertipe TIMESTAMP.
LindormTSDB mengkodekan dan mengurai stempel waktu berdasarkan UTC+8.
Timestamp Unix 32-bit lama harus dikalikan dengan 1.000 sebelum ditulis ke LindormTSDB. Menulis timestamp Unix 32-bit secara langsung menyebabkan error interpretasi semantik. Misalnya,
1641009600merepresentasikan2022-01-01 12:00:00di sistem warisan, tetapi diinterpretasikan sebagai1970-01-20 07:50:09 (UTC+8)di LindormTSDB.
Perilaku kendala NULL:
Saat ini, Lindorm SQL tidak memvalidasi kendala NULL di lapisan SQL — validasi dilakukan oleh mesin penyimpanan, dan aturannya berbeda-beda tergantung mesinnya. Untuk memastikan penulisan data yang benar:
Tentukan
NOT NULLuntuk semua kolom kunci primer.Jangan tentukan
NOT NULLuntuk kolom non-kunci primer.
Kunci primer
Kunci primer secara unik mengidentifikasi baris dalam tabel. Kunci ini terdiri dari satu atau beberapa kolom dan harus ditentukan saat membuat tabel.
Kunci primer tidak dapat diubah setelah dibuat. Rancang kunci primer Anda dengan cermat sebelum membuat tabel.
Batas kunci primer LindormTable:
| Item | Batas |
|---|---|
| Panjang maksimum kolom kunci primer tunggal | 2 KB |
| Panjang total maksimum semua kolom kunci primer | 30 KB |
| Panjang maksimum kolom non-kunci primer tunggal | 2 MB |
Struktur kunci primer LindormTSDB:
Dalam tabel deret waktu, kolom kunci primer memiliki dua peran berbeda:
Kolom tag: Kolom kunci primer bertipe VARCHAR. Mengidentifikasi sumber data — misalnya, ID perangkat dalam skenario Internet of Things (IoT), identifikasi kendaraan dalam skenario Internet of Vehicles (IoV), atau ID aplikasi atau
ip:portdalam skenario pemantauan.Kolom timestamp: Kolom kunci primer bertipe TIMESTAMP. Hanya satu kolom timestamp yang diizinkan per tabel.
Kunci primer dapat berisi satu atau beberapa kolom VARCHAR (tag), tetapi hanya satu kolom TIMESTAMP. Semua kolom kunci primer harus bertipe VARCHAR atau TIMESTAMP.
Untuk panduan merancang kunci primer untuk tabel deret waktu, lihat Praktik terbaik desain PRIMARY KEY.
Ekspresi indeks (KEY|INDEX)
Gunakan kata kunci KEY atau INDEX dalam pernyataan CREATE TABLE untuk membuat indeks saat pembuatan tabel. Dengan cara ini, Anda dapat membuat secondary indexes dan search indexes.
Ekspresi indeks hanya didukung di LindormTable 2.7.7 atau yang lebih baru dan Lindorm SQL 2.8.6.0 atau yang lebih baru. Untuk memeriksa versi Anda, lihat Panduan versi LindormTable dan Panduan versi SQL. Jika Anda tidak dapat melakukan upgrade di konsol, hubungi dukungan teknis Lindorm di DingTalk di s0s3eg3.
Pemberian nama indeks: Jika nama indeks tidak ditentukan, sistem akan menghasilkan nama dalam format table_name_idx_${auto_increment_id}.
Redundansi secondary index (ketika INCLUDE tidak ditentukan):
| Versi Lindorm SQL | Perilaku redundansi default |
|---|---|
| 2.9.3.10 dan yang lebih baru | Kolom tidak disimpan secara redundan secara default |
| Lebih awal dari 2.9.3.10 | Semua kolom disimpan secara redundan secara default (setara dengan INDEX_COVERED_TYPE=COVERED_ALL_COLUMNS_IN_SCHEMA; untuk tabel dinamis, setara dengan COVERED_DYNAMIC_COLUMNS) |
Properti tabel default saat menggunakan KEY/INDEX (jika MUTABILITY dan CONSISTENCY tidak ditentukan):
CONSISTENCY = 'strong'MUTABILITY = 'MUTABLE_LATEST'
Status sisa saat kegagalan pembuatan indeks: Jika terjadi pengecualian selama pembuatan indeks, tabel dan indeks mungkin tetap dalam status sisa dan tidak dihapus secara otomatis. Mereka tetap terlihat melalui pernyataan SHOW dan DESCRIBE, tetapi penulisan dan kueri data mungkin gagal. Hapus secara manual tabel dan indeks sisa tersebut, lalu buat ulang.
Partisi
Partisi hanya didukung di LindormTSDB. Kolom yang digunakan dalam PARTITION BY harus merupakan kolom VARCHAR dalam kunci primer.
Sintaks: PARTITION BY HASH(column1, column2, ..., columnN)
Properti tabel
Hanya LindormTable yang mendukung properti tabel melalui kata kunci WITH.
| Opsi | Tipe | Default | Deskripsi |
|---|---|---|---|
| COMPRESSION | STRING | Tidak ada (ZSTD mulai dari LindormTable 2.3.4) | Algoritma kompresi. Nilai yang valid: SNAPPY, ZSTD, LZ4. |
| TTL | INT | Kosong (tidak kedaluwarsa) | Waktu hidup (TTL) data, dalam detik. Untuk menghapus TTL, atur ke string kosong. Lihat Contoh ALTER TABLE. |
| COMPACTION_MAJOR_PERIOD | LONG | Math.Min(TTL, 1728000000) ms; jika tidak ada TTL: 20 hari (1.728.000.000 ms) | Periode kompaksi mayor, dalam milidetik. |
| MUTABILITY | STRING | MUTABLE_LATEST | Mutabilitas tabel dasar, terkait perilaku indeks. Nilai yang valid: IMMUTABLE, IMMUTABLE_ROWS, MUTABLE_LATEST, MUTABLE_ALL, MUTABLE_UDT. Tidak dapat diubah setelah pembuatan indeks — hapus semua indeks sebelum mengubahnya. Lihat Secondary indexes native berkinerja tinggi. |
| CONSISTENCY | STRING | eventual | Tingkat konsistensi. Nilai yang valid: eventual, strong. Untuk instans multi-zona dengan operasi read-after-write (seperti increment, append, atau pembaruan indeks), atur ke strong. |
| NUMREGIONS | INT | — | Jumlah region yang akan dibuat sebelumnya untuk tabel. |
| CHS | INT | — | Batas data panas/dingin, dalam detik. Memerlukan penyimpanan dingin diaktifkan. Harus digunakan bersama CHS_L2='storagetype=COLD'. Lihat Pemisahan data panas dan dingin. |
| STARTKEY dan ENDKEY | Tipe yang sama dengan kolom kunci primer pertama | — | Kunci awal dan akhir untuk partisi region yang dibuat sebelumnya. Memerlukan NUMREGIONS. Tipe yang didukung: SMALLINT, INTEGER, BIGINT, CHAR, VARCHAR, FLOAT, DOUBLE. |
| SPLITKEYS | Tipe yang sama dengan kolom kunci primer pertama | — | Kunci awal untuk semua partisi yang dibuat sebelumnya, dipisahkan koma. Didukung sejak LindormTable 2.5.4. Tidak dapat digunakan bersama NUMREGIONS, STARTKEY, atau ENDKEY. Koma di dalam tanda kutip ganda dianggap sebagai karakter biasa. Tipe yang didukung: sama seperti STARTKEY/ENDKEY. |
| SPLITALGO | STRING | — | Algoritma pemisahan untuk partisi yang dibuat sebelumnya. Nilai yang valid: HexStringSplit (memisahkan berdasarkan byte heksadesimal), UniformSplit (pemisahan merata berdasarkan nilai byte asli). |
| DYNAMIC_COLUMNS | STRING | False | Mengaktifkan kolom dinamis. Nilai yang valid: True, False. Kolom dinamis hanya mendukung tipe Varbinary. Lihat Kolom dinamis. |
| VERSIONS | STRING | 1 | Jumlah versi yang disimpan per nilai kolom. Harus berupa bilangan bulat >= 1. Nilai besar memengaruhi kinerja kueri dan penyimpanan — pertahankan nilai ini pada 1 kecuali retensi multi-versi diperlukan. Lihat Manajemen data multi-versi. |
| BLOB_BUCKET_NAME | STRING | — | Membuat BUCKET untuk tabel dengan kolom BLOB. Didukung sejak LindormTable 2.6.4. Aturan nama BUCKET: huruf kecil, angka, titik (.), dan tanda hubung (-); 3–63 karakter; tidak boleh dimulai atau diakhiri dengan tanda hubung; tidak boleh ada titik berurutan. |
Pada versi LindormTable sebelum 2.2.16, kata kunciWITHtidak didukung. Alih-alih itu, lampirkan kata kunci properti dalam tanda kutip tunggal. Untuk nilai string, lampirkan juga nilainya dalam tanda kutip tunggal. Contoh:CREATE TABLE IF NOT EXISTS t1(c1 varchar, c2 bigint, c3 int, c4 int, PRIMARY KEY(c1,c2)) 'CONSISTENCY'='strong';
Contoh
Buat tabel dasar
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);Jalankan DESCRIBE table sensor; untuk memverifikasi bahwa tabel telah dibuat.
Buat tabel dengan secondary index
CREATE TABLE IF NOT EXISTS sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time),
KEY (temperature, time)
);Untuk memverifikasi:
Jalankan
DESCRIBE table sensor;untuk memeriksa tabel.Jalankan
SHOW INDEX FROM sensor;untuk memeriksa secondary index.
Atur TTL dan algoritma kompresi
Atur TTL menjadi 30 hari (2.592.000 detik) dan kompresi ke ZSTD.
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (COMPRESSION='ZSTD', TTL='2592000');Untuk memverifikasi:
Jalankan
DESCRIBE table sensor;untuk memeriksa tabel.Di sistem manajemen kluster, buka halaman Overview, klik nama tabel, lalu klik View Table Properties di area Current Details Table untuk mengonfirmasi nilai
COMPRESSIONdanTTL.
Atur periode kompaksi mayor
Atur periode kompaksi mayor menjadi 10 hari (864.000.000 milidetik).
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (COMPACTION_MAJOR_PERIOD='864000000');Untuk memverifikasi: Jalankan DESCRIBE table sensor;, atau klik View Table Properties di area Current Details Table sistem manajemen kluster.
Aktifkan kolom dinamis
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (DYNAMIC_COLUMNS='TRUE');Untuk memverifikasi: Jalankan DESCRIBE table sensor;, atau klik View Table Properties di area Current Details Table sistem manajemen kluster.
Atur batas data panas/dingin
Arsipkan data yang lebih tua dari 86.400 detik (1 hari) ke penyimpanan dingin.
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (CHS = '86400', CHS_L2 = 'storagetype=COLD');CHSmemerlukan penyimpanan dingin diaktifkan dan harus digunakan bersamaCHS_L2='storagetype=COLD'.
Untuk memverifikasi: Jalankan DESCRIBE table sensor;, atau klik View Table Properties di area Current Details Table sistem manajemen kluster untuk mengonfirmasi nilai CHS dan CHS_L2.
Gabungkan beberapa properti
Atur kompresi, TTL, dan batas data panas/dingin secara bersamaan.
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) WITH (
COMPRESSION='ZSTD',
CHS = '86400',
CHS_L2 = 'storagetype=COLD',
TTL = '2592000');Untuk memverifikasi: Jalankan DESCRIBE table sensor;, atau klik View Table Properties di area Current Details Table sistem manajemen kluster untuk mengonfirmasi nilai COMPRESSION, CHS, CHS_L2, dan TTL.
Buat partisi sebelumnya dengan kunci awal dan akhir
Buat lima partisi sebelumnya dengan kunci awal 1.000 dan kunci akhir 9.000. STARTKEY dan ENDKEY memerlukan NUMREGIONS.
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
c1 INTEGER,
c2 VARCHAR,
c3 VARCHAR,
PRIMARY KEY(p1)
) WITH (NUMREGIONS='5', STARTKEY='1000', ENDKEY='9000');Untuk memverifikasi: Jalankan DESCRIBE table sensor;, atau buka area Shard Details di sistem manajemen kluster untuk melihat nilai startKey dan endKey untuk setiap shard.
Buat partisi sebelumnya dengan kunci pemisah eksplisit
Tentukan lima kunci pemisah untuk membuat enam partisi sebelumnya. SPLITKEYS tidak dapat digunakan bersama NUMREGIONS, STARTKEY, atau ENDKEY.
CREATE TABLE sensor (
p1 INT NOT NULL,
p2 INT NOT NULL,
c1 VARCHAR,
c2 BIGINT,
PRIMARY KEY(p1, p2)
) WITH (SPLITKEYS = '100000,300000,500000,700000,900000');Untuk memverifikasi: Jalankan DESCRIBE table sensor;, atau lihat nilai startKey dan endKey di area Shard Details sistem manajemen kluster.
Tentukan kolom kunci partisi
Untuk kueri yang menargetkan data instan dari satu perangkat, tentukan device_id sebagai kunci partisi untuk mengontrol distribusi data.
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
) PARTITION BY HASH(device_id);Jalankan DESCRIBE TABLE sensor; untuk memverifikasi hasil pembuatan tabel.
Buat tabel data spatio-temporal
Tipe spasial apa pun (GEOMETRY) — menerima tipe data spasial apa pun:
CREATE TABLE geoms(gid INT, g GEOMETRY, PRIMARY KEY(gid));Tulis data tipe spasial apa pun:
UPSERT INTO geoms(gid, g) VALUES
(0, ST_GeomFromText('POINT(-10.1 3.3)')),
(1, ST_GeomFromText('LINESTRING(-12.2 4.3, -10.2 4.3)')),
(2, ST_GeomFromText('POLYGON((2 2, 2 8, 8 8, 8 2, 2 2))'));Hanya tipe titik:
CREATE TABLE pts(gid INT, g GEOMETRY(POINT), PRIMARY KEY(gid));UPSERT INTO pts(gid, g) VALUES(0, ST_MakePoint(0,0)),(1, ST_MakePoint(1,1));Hanya tipe Polygon:
CREATE TABLE polys(gid INT, g GEOMETRY(POLYGON), PRIMARY KEY(gid));UPSERT INTO polys(gid,g) VALUES(0, ST_GeomFromText('POLYGON((2 2, 2 8, 8 8, 8 2, 2 2))'));Hanya tipe LineString:
CREATE TABLE lines(gid INT, g GEOMETRY(LINESTRING), PRIMARY KEY(gid));UPSERT INTO lines(gid,g) VALUES(0, ST_GeomFromText('LINESTRING(-12.2 4.3, -10.2 4.3)'));Hanya tipe MULTIPOINT:
CREATE TABLE multipoints(gid INT, g GEOMETRY(MULTIPOINT), PRIMARY KEY(gid));UPSERT INTO multipoints(gid,g) VALUES(0, ST_GeomFromText('MULTIPOINT (10 40, 40 30, 20 20, 30 10)'));Hanya tipe MULTILINESTRING:
CREATE TABLE multilines(gid INT, g GEOMETRY(MULTILINESTRING), PRIMARY KEY(gid));UPSERT INTO multilines(gid,g) VALUES(0, ST_GeomFromText('MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'));Hanya tipe MULTIPOLYGON:
CREATE TABLE multipolys(gid INT, g GEOMETRY(MULTIPOLYGON), PRIMARY KEY(gid));UPSERT INTO multipolys(gid,g) VALUES(0, ST_GeomFromText('MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))'));Hanya tipe GEOMETRYCOLLECTION:
CREATE TABLE collections(gid INT, g GEOMETRY(GEOMETRYCOLLECTION), PRIMARY KEY(gid));UPSERT INTO collections(gid,g) VALUES(0, ST_GeomFromText('GEOMETRYCOLLECTION (POINT (40 10), LINESTRING (10 10, 20 20, 10 40), POLYGON ((40 40, 20 45, 45 30, 40 40)))'));Beberapa kolom spasial:
CREATE TABLE mix(gid INT, pt GEOMETRY(POINT), ply GEOMETRY(POLYGON), PRIMARY KEY(gid));