Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:INSERT INTO ile Veri Aktarma

Son Güncelleme:Oct 08, 2026

ApsaraDB for SelectDB, SelectDB tablolarına veri aktarmak için INSERT INTO deyimleri dahil olmak üzere standart SQL sözdizimini destekler. Dahili tablolarda ETL işlemleri çalıştırmak veya harici veri göllerinden veri eşitlemek için INSERT INTO...SELECT kullanın; test ve doğrulama amaçları için ise INSERT INTO...VALUES kullanın.

INSERT INTO Ne Zaman Kullanılır?

INSERT INTO iki farklı varyanta sahiptir. Senaryonuza göre seçim yapın:

Varyant Kullanım Durumu Kaçınılması Gereken Durum
INSERT INTO...SELECT Dahili tablolarda ETL çalıştırma, katalog aracılığıyla harici veri göllerinden eşitleme —
INSERT INTO...VALUES Test ve doğrulama Üretim ortamları veya büyük veri hacimleri
Önemli

INSERT INTO...VALUES düşük yazma aktarım hızına sahiptir. Küçük ancak sık yazma işlemleri içeren üretim iş yükleri için, çok daha yüksek yazma performansı sunan Stream Load kullanın.

Çalışma Mantığı

Her iki varyant da senkron çalışır; deyim yalnızca aktarım tamamlandıktan sonra yanıt döndürür. Her aktarım, benzersiz bir etikete sahip bir işlem oluşturur. Sonuç; etiketi, işlem kimliğini ve veri görünürlük durumunu içerir.

Ön Koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • Bir ApsaraDB for SelectDB örneği

  • SelectDB'de bir hedef tablo

  • Hedef tablo üzerinde yazma izni

INSERT INTO...SELECT Deyimi

Bu varyantı, zaten SelectDB'de bulunan veriler üzerinde çıkarma, dönüştürme ve yükleme (ETL) işlemleri çalıştırmak veya bir katalog aracılığıyla harici kaynaklardan veri eşitlemek için kullanın.

Dahili Bir Tabloda ETL Çalıştırma

Bir SelectDB tablosundaki verileri dönüştürüp sonuçları başka bir tabloya yazmak için:

INSERT INTO bj_store_sales
SELECT id, total, user_id, sale_timestamp FROM store_sales WHERE region = "bj";

Bu sorgu, store_sales tablosundan region = "bj" koşulunu sağlayan satırları okur ve bunları bj_store_sales tablosuna yazar.

Veri Gölünden Veri Eşitleme

SelectDB katalogları, Hive, Iceberg, Hudi, Elasticsearch ve Java Database Connectivity (JDBC) kaynakları dahil olmak üzere harici veri kaynaklarını eşlemenize ve bunları birleşik sorgularla sorgulamanıza olanak tanır. Bir veri gölünden SelectDB tablosuna veri eşitlemek için katalog kullanın.

Aşağıdaki örnek, bir Hive kaynağından SelectDB'ye veri eşitler.

  1. SelectDB örneğinize bağlanın. Ayrıntılar için bkz. MySQL istemcisi kullanarak bir ApsaraDB for SelectDB örneğine bağlanma.

  2. Hive veri kaynağını entegre etmek için bir katalog oluşturun. Ayrıntılar için bkz. Hive veri kaynağı.

  3. (İsteğe bağlı) Bir hedef veritabanı oluşturun. Veritabanı zaten varsa bu adımı atlayın.

    CREATE DATABASE hive_db;
  4. Hedef veritabanına geçin.

    USE hive_db;
  5. Bir hedef tablo oluşturun. Tablo zaten varsa sütun türlerinin kaynak tablo ile eşleştiğini doğrulayın. Tür eşleme referansı için bkz. Sütun veri türü eşlemeleri.

    CREATE TABLE test_Hive2SelectDB
    (
        id int,
        name varchar(50),
        age int
    )
    DISTRIBUTED BY HASH(id) BUCKETS 4
    PROPERTIES("replication_num" = "1");
  6. (İsteğe bağlı) Aktarmadan önce tabloyu önizleyin.

    SELECT * FROM test_Hive2SelectDB;

    image

  7. Verileri eşitlemek için INSERT INTO...SELECT deyimini çalıştırın. Aktarım işine WITH LABEL kullanarak benzersiz bir etiket atayın.

    INSERT INTO test_Hive2SelectDB WITH LABEL test_label SELECT * FROM hive_catalog.testdb.hive_t;
  8. Verileri doğrulamak için hedef tabloyu sorgulayın. Hedef tablo verileri solda, kaynak veriler sağda gösterilmektedir.

    image

INSERT INTO...VALUES Deyimi

Bu varyantı yalnızca test ve doğrulama amacıyla kullanın, üretim ortamında kullanmayın. Ekleme isteklerini bir SQL istemcisi veya JDBC uygulaması aracılığıyla gönderin.

Öncelikle bir hedef tablo oluşturun:

CREATE TABLE test_table
(
    id int,
    name varchar(50),
    age int
)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES("replication_num" = "1");

SQL İstemcisi Kullanma

Birden çok INSERT INTO deyimini tek bir aktarımda toplu işlem olarak yürütmek için bunları bir işlem içinde gruplayın:

BEGIN;
INSERT INTO test_table VALUES (1, 'Zhang San', 32),(2, 'Li Si', 45),(3, 'Zhao Liu', 23);
INSERT INTO test_table VALUES (4, 'Wang Yi', 32),(5, 'Zhao Er', 45),(6, 'Li Er', 23);
INSERT INTO test_table VALUES (7, 'Li Yi', 32),(8, 'Wang San', 45),(9, 'Zhao Si', 23);
COMMIT;

JDBC Uygulaması Kullanma

Aşağıdaki örnek, JDBC kullanarak tek bir işlemde birden çok INSERT INTO deyimini toplu olarak çalıştırır. Yer tutucu değerleri kendi değerlerinizle değiştirin.

public static void main(String[] args) throws Exception {
    // Number of INSERT statements per batch
    int insertNum = 10;
    // Number of rows per INSERT statement
    int batchSize = 10000;

    // Replace <host> and <port> with your VPC (virtual private cloud) endpoint values.
    // Find these on the Instance Details page under Network Information.
    String URL = "jdbc:mysql://<host>:<port>/test_db?useLocalSessionState=true";
    Connection connection = DriverManager.getConnection(URL, "admin", "<password>");
    Statement statement = connection.createStatement();
    statement.execute("BEGIN;");

    for (int num = 0; num < insertNum; num++) {
        StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO test_table VALUES ");
        for (int i = 0; i < batchSize; i++) {
            if (i > 0) {
                sql.append(",");
            }
            // Replace with your actual field values
            sql.append("(1, 'Zhang San', 32)");
        }
        statement.addBatch(sql.toString());
    }
    statement.addBatch("COMMIT;");
    statement.executeBatch();

    statement.close();
    connection.close();
}

Aktarım Sonucunu Anlama

INSERT INTO senkron çalışır; sonucu belirlemek için dönüş değerini kontrol edin.

Satır Olmadan Başarılı Aktarım

SELECT yan tümcesi hiçbir satır döndürmezse SelectDB şu yanıtı verir:

INSERT INTO tbl1 SELECT * FROM empty_tbl;
Query OK, 0 rows affected (0.02 sec)

Query OK deyimin hatasız çalıştığını gösterir. 0 rows affected ise hiçbir veri aktarılmadığını belirtir.

Satırlarla Başarılı Aktarım

INSERT INTO tbl1 SELECT * FROM tbl2;
Query OK, 4 rows affected (0.38 sec)
{'label':'insert_8510c568-9eda-****-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}

JSON yanıtı şunları içerir:

Alan Açıklama
label Aktarım işi tanımlayıcısı; WITH LABEL ile belirttiğiniz değer veya otomatik oluşturulan bir değerdir. Veritabanı içinde benzersizdir.
status Veri görünürlüğü. visible verilerin sorgulanabilir olduğunu gösterir. committed verilerin yazıldığını ancak henüz görünür olmadığını belirtir.
txnId Bu aktarım için işlem kimliği.
err Beklenmeyen hatalar.

status değeri committed ise veriler nihayetinde görünür hale gelecektir. Kontrol etmek için:

SHOW TRANSACTION WHERE id=4005;

TransactionStatus değeri visible olarak gösteriliyorsa veriler sorgulanabilir durumdadır.

Filtrelenmiş Satırlarla Başarılı Aktarım

Bazı satırlar filtrelendiyse sonuç bir uyarı sayısı gösterir:

Query OK, 2 rows affected, 2 warnings (0.31 sec)
{'label':'insert_f0747f0e-7a35-****-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}

Filtrelenen satırları incelemek için SHOW LOAD çıktısında etiketi bulun:

SHOW LOAD WHERE label="insert_f0747f0e-7a35-****-affa-13a235f4020d";

Ardından, çıktıdaki URL'yi kullanarak hata ayrıntılarını sorgulayın:

SHOW LOAD WARNINGS ON "<error-url>";

Başarısız Aktarım

Aktarım başarısız olursa hiçbir veri yazılmaz ve SelectDB bir hata döndürür:

INSERT INTO tbl1 SELECT * FROM tbl2 WHERE k1 = "a";
ERROR 1064 (HY000): all partitions have no load data. url: http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2

Hata mesajındaki URL'yi kullanarak ayrıntılı hata bilgilerini alın:

SHOW LOAD WARNINGS ON "<error-url>";

Yapılandırma Referansı

Oturum Değişkenleri

Değişken Varsayılan Açıklama
query_timeout 300s (5 dk) INSERT INTO işlemi için zaman aşımı süresi. Aktarım bu süre içinde tamamlanmazsa SelectDB işlemi iptal eder.
enable_insert_strict true true olduğunda, herhangi bir satır filtrelendiyse aktarım başarısız olur. false olduğunda, filtrelenen satırlar sessizce yok sayılır.
enable_unique_key_partial_update false true olduğunda, Merge on Write (MOW) kullanan Unique Key model tablolarında kısmi sütun güncellemelerini etkinleştirir.

Kısmi Sütun Güncellemeleri

Varsayılan olarak INSERT INTO tam satırlar yazar. Merge on Write (MOW) kullanan bir Unique Key model tablosunda yalnızca belirli sütunları güncellemek için:

SET enable_unique_key_partial_update = true;
Önemli
  • Bu değişken yalnızca Merge on Write (MOW) modunu kullanan Unique Key model tabloları için geçerlidir.

  • Hem enable_unique_key_partial_update hem de enable_insert_strict true ise, INSERT INTO yalnızca mevcut satırları güncelleyebilir. Anahtar tabloda yoksa bir hata döndürülür.

  • Hem mevcut sütunları güncellemek hem de yeni satırlar eklemek için enable_unique_key_partial_update = true ve enable_insert_strict = false ayarlayın. Ayrıntılar için bkz. Değişkenleri yapılandırma.

Değişkenlerin tam listesi için bkz. Değişken yönetimi.

En İyi Uygulamalar

Yüksek frekanslı küçük yazmalardan kaçının. Sık yapılan küçük ekleme işlemleri performansı düşürür ve tablolarda kilitlenmelere neden olabilir. Tek bir tablodaki yazma sıklığını yazma başına 10 saniyenin üzerinde tutun ve birden çok satırı tek bir INSERT INTO deyiminde toplayın.

INSERT INTO...VALUES için toplu iş boyutu. Optimum performans için deyim başına 1.000 ila 1.000.000 satır arasında toplu işlem yapın.

Üretim ortamı veri alımı için Stream Load kullanın. Üretim ortamları ve büyük veri hacimleri için INSERT INTO...VALUES yerine Stream Load kullanın.

İzlenebilirlik için etiket atayın. Aktarım işlerine anlamlı etiketler atamak için WITH LABEL kullanın. Bu, iş durumunu sorgulamayı ve hataları ayıklamayı kolaylaştırır. INSERT INTO deyiminde alt sorguları tanımlamak için ortak tablo ifadelerini (CTE) kullanmak istiyorsanız WITH LABEL ve column belirtmeniz gerekir.

Filtreleme eşiği. INSERT INTO, max_filter_ratio parametresini desteklemez. Varsayılan olarak tüm hatalı satırlar yok sayılır (max_filter_ratio = 1 değerine eşdeğerdir). Veri hatalarına karşı sıfır tolerans uygulamak için enable_insert_strict = true ayarlayın.

Sık Sorulan Sorular

Aktarım sırasında neden get table cloud commit lock timeout hatası oluşur?

Bu durum, aynı tabloya yapılan yazma işlemlerinin çok sık olması ve kilit çekişmesine neden olması durumunda oluşur. Yazma sıklığını azaltın; her tabloya en fazla 5 saniyede bir yazma işlemi gelmesini sağlayın ve birden çok küçük ekleme işlemini daha az sayıda, daha büyük toplu işlerde birleştirin.

Sonraki Adımlar

  • Stream Load — üretim kullanım durumları için yüksek aktarım hızlı veri alımı

  • Veri göl ambarı — harici veri kaynaklarını SelectDB ile entegre etme

  • Değişken yönetimi — INSERT INTO davranışı için oturum değişkenlerini yapılandırma