Aracılığıyla paylaş


INSERT

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime

Tabloya yeni satırlar ekler ve isteğe bağlı olarak tabloyu veya bölümleri kısaltabilir. Eklenen satırları değer ifadelerine veya sorgunun sonucuna göre belirtirsiniz.

Tür tablo şemasında mevcutsa Databricks Hive Avro tablolarını desteklemez INSERT.timestamp-millis

Sözdizimi

[ common_table_expression ]
  INSERT { OVERWRITE | INTO } [ TABLE ] table_name
    [ PARTITION clause ]
    [ ( column_name [, ...] ) | BY NAME ]
    query

[ common_table_expression ]
  INSERT INTO [ TABLE ] table_name
    REPLACE WHERE predicate
    query

Not

Delta tablosu INSERT INTO edildiğinde, şema zorlaması ve şema gelişimi desteklenir. Bir sütunun veri türü Delta tablosunun veri türüne güvenli bir şekilde dönüştürülemezse, çalışma zamanı istisnası atılır. Şema evrimi etkinleştirilirse, şemanın gelişmesi için şemanızın son sütunları (veya iç içe yerleştirilmiş sütunlar) olarak yeni sütunlar bulunabilir.

Parametreler

  • ortak tablo ifadesi

    Yaygın tablo ifadeleri (CTE), yinelenen hesaplamaları önlemek veya karmaşık, iç içe sorguların okunabilirliğini geliştirmek için ana sorgu bloğu içinde birden çok kez yeniden kullanılabilen bir veya daha fazla adlandırılmış sorgudur.

  • INTO veya OVERWRITE

    OVERWRITE belirttiğinizde aşağıdakiler geçerlidir:

    • İlk satır eklenmeden önce partition_spec olmadan tablo kesilir.
    • Aksi takdirde, partition_spec ile eşleşen tüm bölümler, ilk satır eklenmeden önce kesilir.

    INTO belirttiğinizde, eklenen tüm satırlar mevcut satırlara eklenir.

  • table_name

    Eklenecek tabloyu tanımlar. Ad bir zamansal belirtim içermemelidir. Tablo bulunamazsa Azure Databricks bir TABLE_OR_VIEW_NOT_FOUND hatası oluşturur.

    Yabancı bir tablo table_name olmamalıdır.

    Şunun için geçerlidir:evet olarak işaretli Databricks Runtime 16.0 ve üstü

    table_name bir seçenek belirtimi içerebilir.

  • PARTITION madde

    Ekleme için bir hedef bölüm belirten isteğe bağlı bir parametre. Ayrıca bölümü yalnızca kısmen belirtebilirsiniz.

    Statik bölüm ()column = value belirtirken, bu sütunun ekleme sütunu listesinde yinelenmemesi gerekir.

    için INSERT OVERWRITE bir bölme belirtildiğinde, table_name bir Delta Lake tablosu olmalıdır.

  • ( column_name [, ...] )

    Tablodaki isteğe bağlı bir sütun listesi. Insert komutu, tablodan belirli bir sütunu en fazla bir kez belirtebilir.

    Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 12.2 LTS ve üzeri

    • Bu komut bir sütunu atlarsa Databricks SQL bunun yerine ilgili varsayılan değeri atar.
    • Hedef tablo şeması eklenen sütun için herhangi bir varsayılan değer tanımlamıyorsa, databricks SQL sütunun null atanabilir olup olmadığını atar NULL . Aksi takdirde Databricks SQL bir hata oluşturur.

    Sütun listesi sağlanmadığında, PARTITION şart cümlesinde atanmış değerleri olanlar hariç tüm sütunların tabloda tanımlanan sıraya göre belirtildiği kabul edilir.

  • BY NAME

    Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 13.3 LTS ve üzeri

    Bu yan tümce açık bir sütun listesi yerine kullanıldığında, komut query'a ait açık sütun adlarını kullanarak query sırasına göre sütun listesini oluşturur. Açık bir sütun listesinde olduğu gibi, her sütunun hedef tabloda mevcut olması ve yinelenmemesi gerekir. table_name içinde bulunan bir sütun, örtük sütun listesinin parçası değilse, bunun yerine DEFAULT değeri kullanılır.

    BY NAME ayrıca, yapıların özniteliklerini ada göre eşleştirir.

    içindeki query hiçbir sütun, yan tümcesinde PARTITION belirtilen bir sütunla veya oluşturulan herhangi bir sütunla eşleşemez.

  • DEĞİşTİr WHEREboolean_expression

    Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 12.2 LTS ve üzeri

    Delta Lake tablosuysa table_name, boolean_expression içinde belirtilen ve boolean-expression ile eşleşen satırları eklemeden önce, query ile eşleşen satırları silin. query içindeki, boolean_expression ile eşleşmeyen satırlar yoksayılır.

    boolean_expression , sonuç türü BOOLEANolarak değerlendirilen herhangi bir ifade olabilir.

    Bkz. replaceWhereile rastgele seçmeli üzerine yazma.

  • sorgu

    Eklenecek satırları üreten sorgu.

    Sorgu tarafından döndürülen sütun sayısını belirtilen veya örtük ekleme sütun listesiyle eşleştirmeniz gerekir.

    Bir veri türü, eşleşen sütun veri türüne güvenli bir şekilde dönüştürülemezse, çalışma zamanı hatası oluşur.

    Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 11.3 LTS ve üzeri

    • Eğer queryVALUES bir yan tümceden oluşuyorsa, expressionDEFAULTolabilir.
    • Eğer querySELECT bir yan tümceden oluşuyorsa, named_expressionDEFAULTolabilir.
    • DEFAULT, öğesine karşılık gelen sütunun DEFAULTaçıkça tanımlanmış table_name ifadesini ekler veya NULL tanımlanmadıysa.

    Şema evrimi etkinleştirilirse, şemanın gelişmesi için şemanızın son sütunları (veya iç içe yerleştirilmiş sütunlar) olarak yeni sütunlar bulunabilir.

Örnekler

Bu bölümde:

INSERT İÇİNE

INSERT kullanarak VALUES

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64) DEFAULT 'unknown', student_id INT)
  PARTITIONED BY (student_id);

-- Single row insert using a `VALUES` clause specifying all columns.
> INSERT INTO students VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);

-- Single row insert using an implicit default for address
> INSERT INTO students(name, student_id) VALUES('Grayson Miller', 222222);

-- Single row insert using an explicit DEFAULT keyword for address
> INSERT INTO students VALUES('Youna Kim', DEFAULT, 333333);

--  Multi-row insert using a `VALUES` clause
> INSERT INTO students VALUES
    ('Bob Brown', '456 Taylor St, Cupertino', 444444),
    ('Cathy Johnson', '789 Race Ave, Palo Alto', 555555);

-- Multi-row insert using a mix of DEFAULT and literals
> INSERT INTO students VALUES
    ('Gwyneth Zhao', '120 Main St, Rockport', 666666),
    ('Jackson Peterson', DEFAULT, 777777);

> SELECT * FROM students;
            name                  address student_id
 ---------------- ------------------------ ----------
        Amy Smith   123 Park Ave, San Jose     111111
   Grayson Miller                  unknown     222222
        Youna Kim                  unknown     333333
        Bob Brown 456 Taylor St, Cupertino     444444
    Cathy Johnson  789 Race Ave, Palo Alto     555555
     Gwyneth Zhao    120 Main St, Rockport     666666
 Jackson Peterson                  unknown     777777

Alt sorgu kullanarak ekleme

-- Assuming the persons table has already been created and populated.
> SELECT * FROM persons;
          name                   address       ssn
 ------------- ------------------------- ---------
 Dora Williams 134 Forest Ave, Melo Park 123456789
   Eddie Davis   245 Market St, Milpitas 345678901

> INSERT INTO students PARTITION (student_id = 444444)
    SELECT name, address FROM persons WHERE name = "Dora Williams";

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111
     Bob Brown  456 Taylor St, Cupertino     222222
 Cathy Johnson   789 Race Ave, Palo Alto     333333
 Dora Williams 134 Forest Ave, Melo Park     444444

-- Use an option specification to influence the write behavior
INSERT INTO t WITH ('write.split-size' = 10) SELECT * FROM s;

Bir TABLE hüküm kullanarak ekleyin

-- Assuming the visiting_students table has already been created and populated.
> SELECT * FROM visiting_students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

> INSERT INTO students TABLE visiting_students;

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith     123 Park Ave,San Jose     111111
     Bob Brown  456 Taylor St, Cupertino     222222
 Cathy Johnson   789 Race Ave, Palo Alto     333333
 Dora Williams 134 Forest Ave, Melo Park     444444
 Fleur Laurent     345 Copper St, London     777777
 Gordon Martin      779 Lake Ave, Oxford     888888

Dizine ekleme

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    PARTITIONED BY (student_id)
    LOCATION "/path/to/students_table";

> INSERT INTO delta.`/path/to/students_table` VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111

Sütun listesiyle ekleme

> INSERT INTO students (address, name, student_id) VALUES
    ('Hangzhou, China', 'Kent Yao', 11215016);
> SELECT * FROM students WHERE name = 'Kent Yao';
      name                address student_id
 --------- ---------------------- ----------
 Kent Yao         Hangzhou, China   11215016

Hem bölüm belirtimiyle hem de sütun listesiyle ekleme

> INSERT INTO students PARTITION (student_id = 11215017) (address, name) VALUES
    ('Hangzhou, China', 'Kent Yao Jr.');
> SELECT * FROM students WHERE student_id = 11215017;
         name                address student_id
 ------------ ---------------------- ----------
 Kent Yao Jr.        Hangzhou, China   11215017

BY NAME yan tümcesini kullanarak INSERT

> CREATE TABLE target(n INT, text STRING, s STRUCT<a INT, b INT>);
> INSERT INTO target BY NAME SELECT named_struct('b', 2, 'a', 1) AS s, 0 AS n, 'data' AS text;
> SELECT * FROM target;
  0  data  {"a":1,"b":2}

> CREATE OR REPLACE TABLE target(n INT, arr ARRAY<STRUCT<a INT, b INT>>);
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS n;
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr;
> SELECT * FROM target;
  0     [{"a":1,"b":2}]
  NULL  [{"a":1,"b":2}]

> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS badname;
Error

> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS n, 1 AS n;
 Error: INSERT_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS

DEĞİŞTİR WHERE

> CREATE TABLE sales(tx_date DATE, amount INTEGER);
> INSERT INTO sales VALUES
   (DATE'2022-10-01', 1234),
   (DATE'2022-10-02', 2345),
   (DATE'2022-10-03', 3456),
   (DATE'2022-11-01', 3214);

-- Replace any rows with a transaction date in October 2022.
> INSERT INTO sales REPLACE WHERE tx_date BETWEEN '2022-10-01' AND '2022-10-31'
   VALUES (DATE'2022-10-01', 1237),
          (DATE'2022-10-02', 2378),
          (DATE'2022-10-04', 2456),
          (DATE'2022-10-05', 6328);
> SELECT * FROM sales ORDER BY  tx_date;
 tx_date    amount
 ---------- ------
 2022-10-01   1237
 2022-10-02   2378
 2022-10-04   2456
 2022-10-05   6328
 2022-11-01   3214

INSERT ÜZERİNE YAZ

Bir VALUES hüküm kullanarak ekleyin

-- Assuming the students table has already been created and populated.
> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111
     Bob Brown  456 Taylor St, Cupertino     222222
 Cathy Johnson   789 Race Ave, Palo Alto     333333
 Dora Williams 134 Forest Ave, Melo Park     444444
 Fleur Laurent     345 Copper St, London     777777
 Gordon Martin      779 Lake Ave, Oxford     888888
   Helen Davis 469 Mission St, San Diego     999999
    Jason Wang     908 Bird St, Saratoga     121212

> INSERT OVERWRITE students VALUES
    ('Ashua Hill', '456 Erica Ct, Cupertino', 111111),
    ('Brian Reed', '723 Kern Ave, Palo Alto', 222222);

> SELECT * FROM students;
       name                 address student_id
 ---------- ----------------------- ----------
 Ashua Hill 456 Erica Ct, Cupertino     111111
 Brian Reed 723 Kern Ave, Palo Alto     222222

Alt sorgu kullanarak ekleme

-- Assuming the persons table has already been created and populated.
> SELECT * FROM persons;
          name                   address       ssn
 ------------- ------------------------- ---------
 Dora Williams 134 Forest Ave, Melo Park 123456789
   Eddie Davis    245 Market St,Milpitas 345678901

> INSERT OVERWRITE students PARTITION (student_id = 222222)
    SELECT name, address FROM persons WHERE name = "Dora Williams";

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
    Ashua Hill   456 Erica Ct, Cupertino     111111
 Dora Williams 134 Forest Ave, Melo Park     222222

Bir TABLE hüküm kullanarak ekleyin

-- Assuming the visiting_students table has already been created and populated.
> SELECT * FROM visiting_students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

> INSERT OVERWRITE students TABLE visiting_students;

> SELECT * FROM students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

Dizini üzerine yazacak şekilde ekle

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    PARTITIONED BY (student_id)
    LOCATION "/path/to/students_table";

> INSERT OVERWRITE delta.`/path/to/students_table` VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111