全部产品
Search
文档中心

Hologres:INSERT

更新时间:Jul 02, 2025

Anda dapat mengeksekusi pernyataan INSERT untuk menyisipkan baris baru ke dalam tabel tertentu. Topik ini menjelaskan cara menggunakan pernyataan INSERT di Hologres.

Sintaksis

Anda dapat menyisipkan satu atau lebih baris yang ditentukan oleh ekspresi nilai, atau nol atau lebih baris yang dihasilkan dari kueri ke dalam tabel di Hologres. Pernyataan INSERT menggunakan sintaksis berikut:

INSERT INTO <schema>.<table> [( <column> [, ...] )]
   VALUES ( {<expression>}  [, ...] )
   [, ...] | <query>}

Tabel berikut menggambarkan parameter dalam pernyataan INSERT.

Parameter

Deskripsi

schema

Nama skema tempat tabel berada.

tabel

Nama tabel ke dalam mana Anda ingin menyisipkan data.

Jika Anda menggunakan Realtime Compute for Apache Flink untuk menulis data ke Hologres, Anda dapat menentukan tabel induk. Data akan secara otomatis ditulis ke tabel anaknya. Di Hologres V1.3 dan versi selanjutnya, Anda dapat mengeksekusi pernyataan INSERT yang sesuai dengan sintaksis penggunaan rencana tetap untuk langsung menulis data ke tabel induk. Untuk informasi lebih lanjut, lihat Mempercepat eksekusi pernyataan SQL dengan menggunakan rencana tetap.

kolom

Nama kolom ke dalam mana Anda ingin menyisipkan data.

Anda dapat memenuhi syarat nama kolom dengan menggunakan nama subbidang atau indeks array. Jika Anda hanya menyisipkan data ke beberapa bidang kolom komposit, bidang lainnya dibiarkan kosong.

ekspresi

Ekspresi atau nilai yang ditetapkan ke kolom yang sesuai.

kueri

Pernyataan SELECT yang menyediakan baris yang akan disisipkan. Untuk informasi lebih lanjut tentang sintaksis pernyataan SELECT, lihat SELECT.

Pernyataan INSERT hanya mendukung metode penulisan data berikut:

  • insert into values:

    INSERT INTO holo2mysqltest (cate_id, cate_name) VALUES
        (3, 'true'),
        (3, 'fale'),
        (3, 'trxxue'),
        (3, 'x'),
        (4, 'The Dinner Game');
  • insert into select:

    insert into test2
    select * from test1;

Cara kerjanya

Model penyimpanan tabel Hologres mencakup penyimpanan berorientasi baris, penyimpanan berorientasi kolom, dan penyimpanan hibrida baris-kolom. Ketiga model tersebut berbagi prinsip penulisan yang sama.

pernyataan INSERT dieksekusi untuk menulis data ke log tulis-depan (WAL) dalam mode Append Only dan memperbarui data ke tabel memori secara real-time. Ini memastikan bahwa data terlihat secara real-time. Namun, tabel memori memiliki ukuran tetap. Jika tabel memori penuh, Hologres beralih ke tabel memori baru dan memicu proses flush asinkron di backend untuk secara bertahap menulis ulang data ke file. File-file tersebut disimpan di Pangu. Selama proses flush, sejumlah besar file kecil dihasilkan. Hologres menggabungkan file kecil ini dan mengurutkannya di backend. Proses ini disebut compaction. Untuk mempercepat proses penulisan data, Hologres menulis data di backend, lalu menekan dan mengurutkan data saat compaction asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat secara signifikan selama proses penulisan data. Setelah proses penulisan data dan proses compaction selesai, penggunaan penyimpanan menurun.

Tabel berorientasi baris, tabel berorientasi kolom, dan tabel hibrida baris-kolom menggunakan format indeks yang berbeda untuk tabel memori di memori dan menggunakan proses yang berbeda untuk menulis ulang data ke file.

  • Tabel berorientasi baris: Data ditulis ulang ke file berorientasi baris dalam format SST.

  • Tabel berorientasi kolom: Data ditulis ulang ke file berorientasi kolom dalam format ORC.

  • Tabel hibrida baris-kolom: Data ditulis ulang ke file berorientasi baris dalam format SST dan file berorientasi kolom dalam format ORC. Selama proses flush, konsistensi data dipastikan. Pesan sukses hanya dikembalikan jika data ditulis ulang ke file berorientasi baris dan file berorientasi kolom. Jika penyimpanan hibrida baris-kolom digunakan, data disimpan secara duplikat. Hal ini meningkatkan overhead penyimpanan.

Batasan

  • Jika Anda menyisipkan data ke tabel induk, pastikan data disisipkan ke tabel anak dari tabel induk. Nilai bidang partisi dalam data yang akan disisipkan harus sama dengan nilai bidang partisi tabel anak.

  • Anda dapat menyesuaikan urutan daftar nama kolom. Jika Anda menggunakan metode insert into select untuk menyisipkan data, pastikan tipe data kolom yang diperlukan konsisten dengan tipe data kolom yang Anda kueri.

Contoh

  • Sisipkan data ke tabel internal.

    CREATE TABLE  holotest (
        a int,
        b bigint,
        c bool,
        e decimal(38,10),
        f text,
        g timestamp,
        h timestamptz,
        i jsonb,
        j int[]
    );
    
    INSERT INTO holotest VALUES (1,9223372036854775807,false,123.123456789123,'john','2020-01-01 01:01:01.123456',
    '2004-10-19 10:23:54+08','{"a":2}',ARRAY[1, 2, 3, 4]);
  • Sisipkan data tabel a ke tabel b.

    CREATE TABLE holotest2(
        a int,
        b bigint,
        c bool);
    
    INSERT INTO holotest2 (a,b,c) SELECT a,b,c FROM holotest;
  • Sisipkan data ke tabel partisi.

    -- Buat tabel induk tanpa kunci utama dan tabel anaknya di skema publik.
    begin;
    create table public.hologres_parent(
      a text,
      b int,
      c timestamp,
      d text
    )
      partition by list(a);
    call set_table_property('public.hologres_parent', 'orientation', 'column');
    
    create table public.hologres_2022 partition of public.hologres_parent for values in('2022');
    
    create table public.hologres_2021 partition of public.hologres_parent for values in('2021');
    
    create table public.hologres_2020 partition of public.hologres_parent for values in('2020');
    commit;
    
    -- Sisipkan data ke tabel anak.
    INSERT INTO public.hologres_2022 values('2022',1,now(),'a')

FAQ

  • Pertanyaan 1: Mengapa metrik pemantauan penggunaan penyimpanan meningkat secara signifikan ketika saya menulis data tetapi kemudian menurun setelah data ditulis?

    Berdasarkan prinsip penulisan data, untuk mempercepat proses penulisan data, Hologres menulis data di backend, lalu menekan dan mengurutkan data saat compaction asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat secara signifikan selama proses penulisan data. Setelah proses penulisan data dan proses compaction selesai, penggunaan penyimpanan menurun.

  • Pertanyaan 2: Mengapa latensi meningkat jika beberapa pernyataan INSERT dieksekusi secara paralel pada tabel yang sama?

    Jika pernyataan INSERT dieksekusi pada tabel tanpa menggunakan rencana tetap, tabel akan dikunci. Eksekusi paralel pernyataan INSERT meningkatkan durasi tunggu kunci, mengakibatkan peningkatan latensi.

  • Pertanyaan 3: Mengapa pesan kesalahan ERROR: no partition of relation "<table_name>" found for row dikembalikan ketika saya menulis data ke tabel induk?

    • Deskripsi masalah: Pesan kesalahan ERROR: no partition of relation "<table_name>" found for row dikembalikan ketika saya menulis data ke tabel induk.

    • Penyebab: Tidak ada tabel anak yang ada.

    • Solusi: Sebelum Anda menulis data, Anda harus membuat tabel anak dengan mengeksekusi pernyataan berikut:

      create table <child_table_name> partition of <parent_table_name> for values in (<value>);
  • Pertanyaan 4: Mengapa pesan kesalahan Currently inserting into parent table is not supported dikembalikan ketika saya mengimpor data?

    • Deskripsi masalah: Pesan kesalahan Currently inserting into parent table is not supported dikembalikan ketika saya mengimpor data.

    • Penyebab: Tabel tempat Anda ingin menyisipkan data adalah tabel induk. Hologres tidak mendukung Anda untuk menulis data ke tabel induk.

    • Solusi: Buat tabel anak untuk menulis data ke tabel anak.