Batasan pada Azure Databricks

Azure Databricks mendukung klausul manajemen batasan SQL standar:

  • Batasan yang diberlakukan memverifikasi integritas data sebelum menambahkan baris ke tabel.
  • Batasan informasi (kunci primer, kunci asing, dan batasan unik) menentukan hubungan antara bidang dalam tabel dan tidak diberlakukan.

Semua batasan di Azure Databricks memerlukan Delta Lake.

Untuk konsep terkait dalam pipeline Lakeflow, lihat Mengelola kualitas data dengan ekspektasi pipeline.

Batasan yang diberlakukan

Ketika batasan dilanggar, transaksi gagal dengan kesalahan. Azure Databricks mendukung dua jenis batasan:

  • NOT NULL: menunjukkan bahwa nilai dalam kolom tertentu tidak boleh null.
  • CHECK: menunjukkan bahwa ekspresi boolean tertentu harus benar untuk setiap baris input.

Note

Menambahkan kendala akan memutakhirkan protokol penulis tabel jika versi penulis saat ini kurang dari 3. Ini dapat memengaruhi kompatibilitas dengan klien Delta Lake eksternal. Lihat Kompatibilitas dan protokol fitur Delta Lake.

batasan NOT NULL

Saat Anda membuat tabel, tentukan NOT NULL batasan dalam skema. Untuk menghapus atau menambahkan NOT NULL batasan setelah pembuatan, gunakan perintah ini ALTER TABLE ... ALTER COLUMN . Contoh berikut membuat tabel people_demo yang akan digunakan kembali di sisa bagian ini:

CREATE OR REPLACE TABLE main.default.people_demo (
  id INT NOT NULL,
  firstName STRING,
  middleName STRING NOT NULL,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
);

ALTER TABLE main.default.people_demo ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE main.default.people_demo ALTER COLUMN ssn SET NOT NULL;

Azure Databricks memverifikasi bahwa semua baris yang ada memenuhi batasan sebelum menambahkan batasan NOT NULL ke tabel.

Jika Anda menentukan batasan NOT NULL pada kolom yang berada dalam struct, maka struct induk juga harus tidak boleh null. Kolom yang ditumpuk dalam jenis array atau peta tidak menerima NOT NULL batasan.

Lihat CREATE TABLE [USING] dan ALTER TABLE ALTER COLUMN.

batasan CHECK

Kelola CHECK batasan dengan perintah ALTER TABLE ADD CONSTRAINT dan ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT memverifikasi bahwa semua baris yang ada memenuhi batasan sebelum menambahkan batasan ke tabel.

Pembatasan berikut berlaku untuk memeriksa batasan:

  • CHECK Ekspresi batasan dapat menggunakan fungsi SQL apa pun di Spark yang selalu mengembalikan hasil yang sama saat diberi nilai argumen yang sama, kecuali jenis fungsi berikut:
    • Fungsi yang ditentukan pengguna.
    • Fungsi agregat.
    • Fungsi jendela.
    • Fungsi yang mengembalikan beberapa baris.

Tambahkan ke tabel yang sudah ada

Contoh berikut menambahkan batasan CHECK ke tabel people_demo yang dibuat di bagian sebelumnya, lalu menghapusnya:

ALTER TABLE main.default.people_demo ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE main.default.people_demo DROP CONSTRAINT dateWithinRange;

Lihat ALTER TABLE ADD CONSTRAINT dan ALTER TABLE DROP CONSTRAINT.

Lihat properti tabel batasan pemeriksaan

Gunakan perintah DESCRIBE DETAIL dan SHOW TBLPROPERTIES untuk melihat batasan CHECK tabel. Contoh berikut menambahkan kendala ke people_demo, lalu menampilkannya:

ALTER TABLE main.default.people_demo ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL main.default.people_demo;

SHOW TBLPROPERTIES main.default.people_demo;

Menghapus batasan pemeriksaan

Di Databricks Runtime 15.4 LTS ke atas, gunakan DROP FEATURE perintah untuk menghapus batasan pemeriksaan dari tabel dan menurunkan tingkat protokol tabel.

Lihat Menghilangkan fitur tabel Delta Lake dan menurunkan protokol tabel.

Mendeklarasikan kunci primer, kunci asing, dan batasan unik

Kunci primer, kunci asing, dan batasan unik hanya bersifat informasi dan tidak diberlakukan. Mereka mungkin meningkatkan performa melalui pengoptimalan kueri.

  • Kunci primer dan kunci asing: tersedia untuk tabel Unity Catalog dan Delta Lake di Databricks Runtime 13.3 LTS ke atas. GA di Databricks Runtime 15.2 ke atas. Kunci asing harus mereferensikan kunci primer atau batasan unik dalam tabel lain.
  • Unik: tersedia di Pratinjau Umum untuk tabel Unity Catalog dan Delta Lake di Databricks SQL dan Databricks Runtime 18.2 ke atas. Tabel dapat memiliki beberapa batasan unik. Kunci asing dapat merujuk ke kolom unik menggunakan REFERENCES parent_table(unique_col). Kolom unik dapat bernilai null karena nilai NULL dianggap berbeda satu sama lain.

Kueri information_schema, gunakan DESCRIBE TABLE EXTENDED, atau gunakan SHOW CREATE TABLE untuk mendapatkan rincian tentang bagaimana batasan diterapkan pada katalog tertentu.

Tambahkan ke tabel baru

Deklarasikan kunci primer, kunci asing, dan batasan unik sebagai bagian dari klausa spesifikasi tabel selama pembuatan tabel:

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
                CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL PRIMARY KEY,
                fk1 INTEGER, fk2 INTEGER,
                CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL,
                CONSTRAINT u_uq_email UNIQUE(email));

Pernyataan CTAS tidak mendukung klausul batasan ini.

Tambahkan ke tabel yang sudah ada

Sebagai alternatif, tambahkan batasan yang sama ke tabel yang sudah ada. Pendekatan ini mencapai hasil yang sama seperti bagian sebelumnya. Contoh berikut membuat ulang T, S, dan U tanpa batasan, kemudian menambahkan setiap batasan menggunakan ALTER TABLE ADD CONSTRAINT. Tambahkan kunci utama sebelum kunci asing yang merujuknya:

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL);
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL, fk1 INTEGER, fk2 INTEGER);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL);

ALTER TABLE main.default.T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE main.default.S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T;
ALTER TABLE main.default.U ADD CONSTRAINT u_uq_email UNIQUE(email);

Sumber daya tambahan