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 INSERT Databricks Hive Avro tablolarını desteklemeztimestamp-millis.

Syntax

[ 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 | REPLACE USING ( column_name [, ...] ) ]
    query

[ common_table_expression ]
  INSERT INTO [ TABLE ] table_name [target_alias]
    REPLACE ON boolean_expression
    { (query) [source_alias] | query }

Note

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.

Parameters

  • 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şaretlendi Databricks Runtime 16.0 ve üzerini denetleyin

    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 bölüm belirtirken, 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.

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi 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

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi 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 yalnızca tablodaki özniteliklere başvurabilir.

    Bkz. replaceWhereile rastgele seçmeli üzerine yazma.

  • REPLACE USING ( column_name [, ...] )

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL evet olarak işaretlendi Databricks Runtime 16.3 ve üzeri

    Belirtilen sütunlarda table_name içindeki bir satırla eşleşen query satırlarını atomik olarak siler, ardından query'den satırları ekler. Eşleştirme, ve querytablosunda belirtilen sütun değerlerinin eşitlik karşılaştırmasını temel alır.

    Databricks Runtime 16.3 ile 17.1 arasında bu özellik, belirtilen sütunların tablonun tüm bölüm sütunlarını içermesini gerektirir.

    Note

    Benzer şekilde, JOIN USING, REPLACE USING değerleri düzenli eşitlik karşılaştırması kullanarak satırları eşleştirir ve NULL değerleri hiçbir şeye eşit olarak değerlendirilmez. Belirtilen sütunlarda NULL değerleri bulunan satırlar eşleşmez ve bu yüzden hedef tablodan kaldırılmaz.

  • query

    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.

  • target_alias

    için tablo için isteğe bağlı bir tablo REPLACE ONdiğer adı. Diğer ad bir sütun listesi içermemelidir.

  • source_alias

    için queryisteğe bağlı REPLACE ON. Diğer ad bir sütun listesi içermemelidir.

  • boolean_expression DEĞİŞTİR

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 17.1 ve üzeri

    Delta Lake tablosuysatable_name, REPLACE ON tabloda belirtilen query göre satırlarla eşleşen satırları atomik olarak siler ve sonra satırları eklerquery. 'nin REPLACE WHERE farklı olarak boolean_expression REPLACE ONhem tablodaki hem de içindeki sütunlara query query boşsa, eşleştirecek satır olmadığından silme işlemi gerçekleşmezquery.

Examples

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

KULLANARAK DEĞİşTİr

> CREATE TABLE students (name STRING, country STRING) PARTITIONED BY (country);
> CREATE TABLE new_students (name STRING, country STRING);

> INSERT INTO students VALUES
    ('Dylan', 'US'),
    ('Doug', 'UK'),
    ('Julia', 'IT'),
    ('David', 'DE'),
    ('Liz', 'CN'),
    ('Adam', NULL);

> INSERT INTO new_students VALUES
    ('Peter', 'FR'),
    ('Jennie', 'UK'),
    ('Eva', NULL);

-- Replace any rows in `students` that have matching `country` values in `new_students`.
> INSERT INTO TABLE students
    REPLACE USING (country)
    SELECT * FROM new_students;

> SELECT * FROM students;
   name       country
  ------      -------
   Dylan           US
  Jennie           UK
   Julia           IT
   David           DE
     Liz           CN
   Peter           FR
    Adam         NULL
     Eva         NULL

DEĞİşTİr

> CREATE TABLE students (name STRING, row_origin STRING)
> CREATE TABLE people (name STRING, row_origin STRING)

> INSERT INTO students VALUES ('Alice', 'table'), (NULL, 'table'), ('Bob', 'table')
> INSERT INTO people VALUES ('Alice', 'query'), (NULL, 'query'), ('Delta', 'query')

> INSERT INTO TABLE students AS t
  REPLACE ON t.name <=> s.name
  (SELECT * FROM people) AS s

> SELECT * FROM students
  name        row_origin
 -----        ----------
 Alice             query
  NULL             query
   Bob             table
 Delta             query

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