BUAT TABEL (Transact-SQL)

Berlaku untuk:yes SQL Server (semua versi yang didukung) Ya Azure SQL Database

Membuat tabel baru di database SQL Server dan Azure SQL.

Catatan

Untuk sintaks analitik Azure Synapse, lihat CREATE TABLE (Azure Synapse Analytics).

tautan topikIkon Konvensi Sintaks Transact-SQL

Sintaks Sederhana

-- Simple CREATE TABLE Syntax (common if not using options)
CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition> } [ ,...n ] )
[ ; ]

Sintaks Penuh

-- Disk-Based CREATE TABLE Syntax
CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ AS FileTable ]
    ( {   <column_definition>
        | <computed_column_definition>
        | <column_set_definition>
        | [ <table_constraint> ] [ ,... n ]
        | [ <table_index> ] }
          [ ,...n ]
          [ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
             , system_end_time_column_name ) ]
      )
    [ ON { partition_scheme_name ( partition_column_name )
           | filegroup
           | "default" } ]
    [ TEXTIMAGE_ON { filegroup | "default" } ]
    [ FILESTREAM_ON { partition_scheme_name
           | filegroup
           | "default" } ]
    [ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]
  
<column_definition> ::=
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ]
    [ SPARSE ]
    [ MASKED WITH ( FUNCTION = 'mask_function') ]
    [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
    [ IDENTITY [ ( seed , increment ) ]
    [ NOT FOR REPLICATION ]
    [ GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] ]
    [ NULL | NOT NULL ]
    [ ROWGUIDCOL ]
    [ ENCRYPTED WITH
        ( COLUMN_ENCRYPTION_KEY = key_name ,
          ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,
          ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ) ]
    [ <column_constraint> [, ...n ] ]
    [ <column_index> ]
  
<data_type> ::=
[ type_schema_name. ] type_name
    [ ( precision [ , scale ] | max |
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
  
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{ 
   { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH FILLFACTOR = fillfactor
          | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
            | filegroup | "default" } ]
  
  | [ FOREIGN KEY ]
        REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]
  
  | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
  
<column_index> ::=
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name (column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
  
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH FILLFACTOR = fillfactor
          | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
        | filegroup | "default" } ]
  
    | [ FOREIGN KEY ]
        REFERENCES referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE } ]
        [ ON UPDATE { NO ACTION } ]
        [ NOT FOR REPLICATION ]
  
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]
  
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
  
<table_constraint> ::=
[ CONSTRAINT constraint_name ]
{
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        (column [ ASC | DESC ] [ ,...n ] )
        [
            WITH FILLFACTOR = fillfactor
           | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ]
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )

<table_index> ::=
{  
    {  
      INDEX index_name  [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
         (column_name [ ASC | DESC ] [ ,... n ] )
    | INDEX index_name CLUSTERED COLUMNSTORE
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )
    }
    [ WHERE <filter_predicate> ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
  
}

<table_option> ::=
{  
    [ DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ , ...n ] ) ] ]
    [ XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ , ...n ] ) ] ]
    [ FILETABLE_DIRECTORY = <directory_name> ]
    [ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
    [ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ SYSTEM_VERSIONING = ON 
        [ ( HISTORY_TABLE = schema_name.history_table_name
          [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] 
    ) ] 
    ]
    [ REMOTE_DATA_ARCHIVE =
      {
        ON [ ( <table_stretch_options> [,...n] ) ]
        | OFF ( MIGRATION_STATE = PAUSED )
      }
    ]   
    [ DATA_DELETION = ON  
          { ( 
             FILTER_COLUMN = column_name,   
             RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS 
                              | MONTH | MONTHS | YEAR | YEARS }
        ) }  
    ]
    [ LEDGER = ON [ ( <ledger_option> [,...n ] ) ] 
    | OFF 
    ]
}

<ledger_option>::= 
{
    [ LEDGER_VIEW = schema_name.ledger_view_name  [ ( <ledger_view_option> [,...n ] ) ]
    [ APPEND_ONLY = ON | OFF ]
}

<ledger_view_option>::= 
{
    [ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
    [ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
    [ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
    [ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
}
  
<table_stretch_options> ::=
{  
    [ FILTER_PREDICATE = { NULL | table_predicate_function } , ]
      MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
 }   
  
<index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
  | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
       [ ON PARTITIONS ( { partition_number_expression | <range> }
       [ , ...n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ , ...n ] ) ] ]
}

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Sintaks untuk tabel memori yang dioptimalkan

-- Memory optimized CREATE TABLE Syntax
CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition>
    | [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ]
      [ ,... n ] }
      [ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
        , system_end_time_column_name ) ]
)
    [ WITH ( <table_option> [ ,... n ] ) ]
 [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ GENERATED ALWAYS AS ROW { START | END } [ HIDDEN ] ]
    [ NULL | NOT NULL ]
[
    [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
    | [ IDENTITY [ ( 1, 1 ) ]
]
    [ <column_constraint> ]
    [ <column_index> ]
  
<data_type> ::=
 [type_schema_name. ] type_name [ (precision [ , scale ]) ]

<column_constraint> ::=
 [ CONSTRAINT constraint_name ]
{
  { PRIMARY KEY | UNIQUE }
      { NONCLUSTERED
        | NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
      }
  | [ FOREIGN KEY ]
        REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
  | CHECK ( logical_expression )
}
  
<table_constraint> ::=
 [ CONSTRAINT constraint_name ]
{
   { PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
                    }
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
    | CHECK ( logical_expression )
}

<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH ( BUCKET_COUNT = bucket_count ) }

<table_index> ::=
  INDEX index_name
{   [ NONCLUSTERED ] HASH ( column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
  | [ NONCLUSTERED ] ( column [ ASC | DESC ] [ ,... n ] )
      [ ON filegroup_name | default ]
  | CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [ Minutes ] } ) ]
      [ ON filegroup_name | default ]
  
}
  
<table_option> ::=
{  
    MEMORY_OPTIMIZED = ON
  | DURABILITY = { SCHEMA_ONLY | SCHEMA_AND_DATA }
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name.history_table_name
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
  
}

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

database_name
Adalah nama database tempat tabel dibuat. database_name harus menentukan nama database yang sudah ada. Jika tidak ditentukan, database_name default ke database saat ini. Login untuk koneksi saat ini harus dikaitkan dengan ID pengguna yang ada dalam database yang ditentukan oleh database_name, dan ID pengguna tersebut harus memiliki izin CREATE TABLE.

nama_skema
Adalah nama skema tempat tabel baru berada.

table_name
Adalah nama tabel baru. Nama tabel harus mengikuti aturan untuk pengidentifikasi. table_name bisa maksimal 128 karakter, kecuali untuk nama tabel sementara lokal (nama yang diawali dengan tanda angka tunggal (#)) yang tidak boleh melebihi 116 karakter.

AS FileTable
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2012 (11.x)).

Membuat tabel baru sebagai FileTable. Anda tidak menentukan kolom karena FileTable memiliki skema tetap. Untuk informasi selengkapnya, lihat FileTables.

column_name
computed_column_expression
Adalah ekspresi yang menentukan nilai kolom komputasi. Kolom komputasi adalah kolom virtual yang tidak disimpan secara fisik dalam tabel, kecuali kolom ditandai PERSISTED. Kolom dihitung dari ekspresi yang menggunakan kolom lain dalam tabel yang sama. Misalnya, kolom komputasi dapat memiliki definisi: biaya as harga * qty. Ekspresi dapat berupa nama kolom, konstanta, fungsi, variabel, dan kombinasi apa pun yang disambungkan oleh satu atau beberapa operator. Ekspresi tidak boleh berupa subkueri atau berisi jenis data alias.

Kolom komputasi dapat digunakan dalam daftar pilihan, klausa WHERE, klausa ORDER BY, atau lokasi lain di mana ekspresi reguler dapat digunakan, dengan pengecualian berikut:

  • Kolom komputasi harus ditandai PERSISTED untuk berpartisipasi dalam batasan FOREIGN KEY atau CHECK.

  • Kolom komputasi dapat digunakan sebagai kolom kunci dalam indeks atau sebagai bagian dari batasan KUNCI PRIMER atau UNIK, jika nilai kolom komputasi ditentukan oleh ekspresi deterministik dan jenis data hasil diizinkan dalam kolom indeks.

    Misalnya, jika tabel memiliki kolom bilangan bulat a dan b, kolom komputasi a+b dapat diindeks, tetapi kolom komputasi a+DATEPART(dd, GETDATE()) tidak dapat diindeks karena nilainya dapat berubah dalam pemanggilan berikutnya.

  • Kolom komputasi tidak dapat menjadi target pernyataan INSERT atau UPDATE.

Catatan

Setiap baris dalam tabel bisa memiliki nilai yang berbeda untuk kolom yang terlibat dalam kolom komputasi; oleh karena itu, kolom komputasi mungkin tidak memiliki nilai yang sama untuk setiap baris.

Berdasarkan ekspresi yang digunakan, nullabilitas kolom komputasi ditentukan secara otomatis oleh Mesin Database. Hasil dari sebagian besar ekspresi dianggap nullable meskipun hanya kolom yang tidak dapat diulang yang ada, karena kemungkinan underflow atau luapan juga menghasilkan hasil NULL. COLUMNPROPERTY Gunakan fungsi dengan properti AllowsNull untuk menyelidiki nullability kolom komputasi apa pun dalam tabel. Ekspresi yang dapat diubah ke null dapat diubah menjadi yang tidak dapat diubah dengan menentukan ISNULL dengan konstanta check_expression , di mana konstanta adalah nilai nonnull yang digantikan untuk hasil NULL apa pun. Izin REFERENSI pada jenis diperlukan untuk kolom komputasi berdasarkan ekspresi jenis yang ditentukan pengguna common language runtime (CLR).

BERTAHAN
Menentukan bahwa mesin database SQL Server akan secara fisik menyimpan nilai komputasi dalam tabel, dan memperbarui nilai ketika kolom lain yang bergantung pada kolom komputasi diperbarui. Menandai kolom komputasi sebagai PERSISTED memungkinkan Anda membuat indeks pada kolom komputasi yang deterministik, tetapi tidak tepat. Untuk informasi selengkapnya, lihat Indeks pada Kolom Komputasi. Setiap kolom komputasi yang digunakan sebagai kolom partisi dari tabel yang dipartisi harus ditandai secara eksplisit PERSISTED. computed_column_expression harus deterministik ketika PERSISTED ditentukan.

ON { partition_scheme | filegroup | "default" }
Menentukan skema partisi atau grup file tempat tabel disimpan. Jika partition_scheme ditentukan, tabel akan menjadi tabel yang dipartisi yang partisinya disimpan pada satu set atau beberapa grup file yang ditentukan dalam partition_scheme. Jika grup file ditentukan, tabel disimpan dalam grup file bernama. Grup file harus ada di dalam database. Jika "default" ditentukan, atau jika ON tidak ditentukan sama sekali, tabel disimpan pada grup file default. Mekanisme penyimpanan tabel seperti yang ditentukan dalam CREATE TABLE kemudian tidak dapat diubah.

PADA {partition_scheme | grup file | "default"} juga dapat ditentukan dalam batasan KUNCI PRIMER atau UNIK. Batasan ini membuat indeks. Jika grup file ditentukan, indeks disimpan dalam grup file bernama. Jika "default" ditentukan, atau jika ON tidak ditentukan sama sekali, indeks disimpan dalam grup file yang sama dengan tabel. PRIMARY KEY Jika atau UNIQUE batasan membuat indeks berkluster, halaman data untuk tabel disimpan dalam grup file yang sama dengan indeks. Jika CLUSTERED ditentukan atau batasan sebaliknya membuat indeks berkluster, dan partition_scheme ditentukan bahwa berbeda dari partition_scheme atau grup file definisi tabel, atau sebaliknya, hanya definisi batasan yang akan dihormati, dan yang lain akan diabaikan.

Catatan

Dalam konteks ini, defaultnya bukan kata kunci. Ini adalah pengidentifikasi untuk grup file default dan harus dibatasi, seperti dalam ON "default" atau ON [default]. Jika "default" ditentukan, QUOTED_IDENTIFIER opsi harus AKTIF untuk sesi saat ini. Ini adalah pengaturan default. Untuk informasi selengkapnya, lihat MENGATUR QUOTED_IDENTIFIER.

Setelah Anda membuat tabel yang dipartisi, pertimbangkan untuk mengatur LOCK_ESCALATION opsi untuk tabel ke AUTO. Ini dapat meningkatkan konkurensi dengan mengaktifkan kunci untuk meningkatkan ke tingkat partisi (HoBT) alih-alih tabel. Untuk informasi selengkapnya, lihat MENGUBAH TABEL.

TEXTIMAGE_ON { filegroup| "default" }
Menunjukkan bahwa teks, ntext, gambar, xml, varchar(max), nvarchar(max), varbinary(max), dan kolom jenis clr yang ditentukan pengguna (termasuk geometri dan geografi) disimpan pada grup file yang ditentukan.

TEXTIMAGE_ON tidak diizinkan jika tidak ada kolom nilai besar dalam tabel. TEXTIMAGE_ON tidak dapat ditentukan jika partition_scheme ditentukan. Jika "default" ditentukan, atau jika TEXTIMAGE_ON tidak ditentukan sama sekali, kolom nilai besar disimpan dalam grup file default. Penyimpanan data kolom nilai besar yang ditentukan di CREATE TABLE tidak dapat diubah kemudian.

Catatan

Nilai Varchar(max), nvarchar(max), varbinary(max), xml, dan UDT besar disimpan langsung di baris data, hingga batas 8.000 byte dan selama nilainya dapat sesuai dengan rekaman. Jika nilai tidak pas dalam rekaman, penunjuk disimpan secara berurutan dan sisanya disimpan di luar baris di ruang penyimpanan LOB. 0 adalah nilai default, yang menunjukkan bahwa semua nilai disimpan langsung di baris data.

TEXTIMAGE_ON hanya mengubah lokasi "ruang penyimpanan LOB", itu tidak mempengaruhi ketika data disimpan secara berurut. Gunakan opsi tipe nilai besar di luar baris sp_tableoption untuk menyimpan seluruh nilai LOB dari baris.

Dalam konteks ini, defaultnya bukan kata kunci. Ini adalah pengidentifikasi untuk grup file default dan harus dibatasi, seperti dalam TEXTIMAGE_ON "default" atau TEXTIMAGE_ON [default]. Jika "default" ditentukan, QUOTED_IDENTIFIER opsi harus AKTIF untuk sesi saat ini. Ini adalah pengaturan default. Untuk informasi selengkapnya, lihat MENGATUR QUOTED_IDENTIFIER.

FILESTREAM_ON { partition_scheme_name | | grup file "default" }
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2008 R2). Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILESTREAM.

Menentukan grup file untuk data FILESTREAM.

Jika tabel berisi data FILESTREAM dan tabel dipartisi, klausa FILESTREAM_ON harus disertakan dan harus menentukan skema partisi grup file FILESTREAM. Skema partisi ini harus menggunakan fungsi partisi dan kolom partisi yang sama dengan skema partisi untuk tabel; jika tidak, kesalahan dimunculkan.

Jika tabel tidak dipartisi, kolom FILESTREAM tidak dapat dipartisi. Data FILESTREAM untuk tabel harus disimpan dalam satu grup file. Grup file ini ditentukan dalam klausa FILESTREAM_ON.

Jika tabel tidak dipartisi dan FILESTREAM_ON klausa tidak ditentukan, grup file FILESTREAM yang memiliki DEFAULT kumpulan properti digunakan. Jika tidak ada grup file FILESTREAM, kesalahan akan muncul.

Seperti halnya ON dan TEXTIMAGE_ON, nilai yang ditetapkan dengan menggunakan CREATE TABLE untuk FILESTREAM_ON tidak dapat diubah, kecuali dalam kasus berikut:

  • Pernyataan CREATE INDEX mengonversi tumpukan menjadi indeks berkluster. Dalam hal ini, grup file, skema partisi, atau NULL FILESTREAM yang berbeda dapat ditentukan.
  • Pernyataan DROP INDEX mengonversi indeks berkluster menjadi tumpukan. Dalam hal ini, grup file FILESTREAM yang berbeda, skema partisi, atau "default" dapat ditentukan.

Grup file dalam FILESTREAM_ON <filegroup> klausa, atau setiap grup file FILESTREAM yang dinamai dalam skema partisi, harus memiliki satu file yang ditentukan untuk grup file. File ini harus ditentukan dengan menggunakan pernyataan CREATE DATABASE atau ALTER DATABASE ; jika tidak, kesalahan akan muncul.

Untuk topik FILESTREAM terkait, lihat Objek Besar Biner - Data Blob.

[ type_schema_name.type_name
Menentukan jenis data kolom, dan skema tempat kolom tersebut berada. Untuk tabel berbasis disk, jenis data bisa menjadi salah satu dari berikut ini:

  • Jenis data sistem
  • Jenis alias berdasarkan jenis data sistem SQL Server. Jenis data alias dibuat dengan CREATE TYPE pernyataan sebelum dapat digunakan dalam definisi tabel. Penetapan NULL atau NOT NULL untuk jenis data alias dapat ditimpa selama CREATE TABLE pernyataan. Namun, spesifikasi panjang tidak dapat diubah; panjang untuk jenis data alias tidak dapat ditentukan dalam CREATE TABLE pernyataan.
  • Jenis yang ditentukan pengguna CLR. Jenis yang ditentukan pengguna CLR dibuat dengan CREATE TYPE pernyataan sebelum dapat digunakan dalam definisi tabel. Untuk membuat kolom pada jenis yang ditentukan pengguna CLR, izin REFERENCES diperlukan pada jenis .

Jika type_schema_name tidak ditentukan, SQL Server Mesin Database mereferensikan type_name dalam urutan berikut:

  • Jenis data sistem SQL Server.
  • Skema default pengguna saat ini dalam database saat ini.
  • Skema dbo dalam database saat ini.

Untuk tabel yang dioptimalkan memori, lihat Jenis Data yang Didukung untuk In-Memory OLTP untuk daftar jenis sistem yang didukung.

presisi
Adalah presisi untuk jenis data yang ditentukan. Untuk informasi selengkapnya tentang nilai presisi yang valid, lihat Presisi, Skala, dan Panjang.

sisik
Adalah skala untuk jenis data yang ditentukan. Untuk informasi selengkapnya tentang nilai skala yang valid, lihat Presisi, Skala, dan Panjang.

maks
Hanya berlaku untuk tipe data varchar, nvarchar, dan varbinary untuk menyimpan 2^31 byte karakter dan data biner, dan 2^30 byte data Unicode.

KONTEN
Menentukan bahwa setiap instans jenis data xml di column_name dapat berisi beberapa elemen tingkat atas. CONTENT hanya berlaku untuk tipe data xml dan hanya dapat ditentukan jika xml_schema_collection juga ditentukan. Jika tidak ditentukan, CONTENT adalah perilaku default.

SURAT
Menentukan bahwa setiap instans jenis data xml di column_name hanya dapat berisi satu elemen tingkat atas. DOCUMENT hanya berlaku untuk tipe data xml dan hanya dapat ditentukan jika xml_schema_collection juga ditentukan.

xml_schema_collection
Hanya berlaku untuk tipe data xml untuk mengaitkan kumpulan skema XML dengan jenis . Sebelum mengetik kolom xml ke skema, skema harus terlebih dahulu dibuat dalam database dengan menggunakan CREATE XML SCHEMA COLLECTION.

DEFAULT
Menentukan nilai yang disediakan untuk kolom ketika nilai tidak disediakan secara eksplisit selama penyisipan. Definisi DEFAULT dapat diterapkan ke kolom apa pun kecuali yang didefinisikan sebagai tanda waktu, atau yang memiliki IDENTITY properti . Jika nilai default ditentukan untuk kolom jenis yang ditentukan pengguna, jenis tersebut harus mendukung konversi implisit dari constant_expression ke jenis yang ditentukan pengguna. Definisi DEFAULT dihapus saat tabel dihilangkan. Hanya nilai konstanta, seperti string karakter; fungsi skalar (baik sistem, fungsi yang ditentukan pengguna, atau CLR); atau NULL dapat digunakan sebagai default. Untuk mempertahankan kompatibilitas dengan versi SQL Server yang lebih lama, nama batasan dapat ditetapkan ke DEFAULT.

constant_expression
Adalah fungsi konstanta, NULL, atau sistem yang digunakan sebagai nilai default untuk kolom.

memory_optimized_constant_expression
Adalah fungsi konstanta, NULL, atau sistem yang didukung dalam digunakan sebagai nilai default untuk kolom. Harus didukung dalam prosedur tersimpan yang dikompilasi secara asli. Untuk informasi selengkapnya tentang fungsi bawaan dalam prosedur tersimpan yang dikompilasi secara asli, lihat Fitur yang Didukung untuk Modul T-SQL yang Dikompilasi Secara Asli.

IDENTITAS
Menunjukkan bahwa kolom baru adalah kolom identitas. Saat baris baru ditambahkan ke tabel, Mesin Database menyediakan nilai inkremental yang unik untuk kolom tersebut. Kolom identitas biasanya digunakan dengan batasan PRIMARY KEY untuk berfungsi sebagai pengidentifikasi baris unik untuk tabel. Properti IDENTITY dapat ditetapkan ke kolom tinyint, smallint, int, bigint, decimal(p,0), atau numerik(p,0). Hanya satu kolom identitas yang dapat dibuat per tabel. Default terikat dan batasan DEFAULT tidak dapat digunakan dengan kolom identitas. Benih dan kenaikan atau tidak keduanya harus ditentukan. Jika tidak ditentukan, defaultnya adalah (1,1).

Nilai awal
Adalah nilai yang digunakan untuk baris pertama yang dimuat ke dalam tabel.

Kenaikan
Adalah nilai inkremental yang ditambahkan ke nilai identitas dari baris sebelumnya yang dimuat.

BUKAN UNTUK REPLIKASI
CREATE TABLE Dalam pernyataan , NOT FOR REPLICATION klausul dapat ditentukan untuk properti IDENTITY, batasan FOREIGN KEY, dan batasan CHECK. Jika klausul ini ditentukan untuk IDENTITY properti , nilai tidak bertahap dalam kolom identitas saat agen replikasi melakukan penyisipan. Jika klausul ini ditentukan untuk batasan, batasan tidak diberlakukan saat agen replikasi melakukan operasi sisipkan, perbarui, atau hapus.

SELALU DIHASILKAN SEBAGAI { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] [ NOT NULL ]
Berlaku untuk: SQL Server (SQL Server 2016 (13.x) dan yang lebih baru) dan database Azure SQL.

Menentukan kolom yang digunakan oleh sistem untuk merekam informasi secara otomatis tentang versi baris dalam tabel dan tabel riwayatnya (jika tabel berversi sistem dan memiliki tabel riwayat). Gunakan argumen ini dengan WITH SYSTEM_VERSIONING = ON parameter untuk membuat tabel versi sistem: tabel temporal atau ledger. Untuk informasi selengkapnya, lihat tabel ledger dantabel temporal yang dapat diperbarui.

Parameter Jenis data yang diperlukan Kemampuan null yang diperlukan Deskripsi
ROW datetime2 MULAI: NOT NULL
UJUNG: NOT NULL
Baik waktu mulai yang versi barisnya valid (START) atau waktu akhir yang versi barisnya valid (END). Gunakan argumen ini dengan PERIOD FOR SYSTEM_TIME argumen untuk membuat tabel temporal.
TRANSACTION_ID bigint MULAI: NOT NULL
UJUNG: NULL
ID transaksi yang membuat (START) atau membatalkan (END) versi baris. Jika tabel adalah tabel ledger, ID mereferensikan baris dalam tampilan sys.database_ledger_transactions .
Berlaku untuk: SQL Server 2022, Azure SQL Database.
SEQUENCE_NUMBER bigint MULAI: NOT NULL
UJUNG: NULL
Jumlah urutan operasi yang membuat (START) atau menghapus (END) versi baris. Nilai ini unik dalam transaksi.
Berlaku untuk: SQL Server 2022, Azure SQL Database.

Jika Anda mencoba menentukan kolom yang tidak memenuhi jenis data atau persyaratan nullability di atas, sistem akan melemparkan kesalahan. Jika Anda tidak secara eksplisit menentukan nullability, sistem akan menentukan kolom sesuai NULL atau NOT NULL sesuai persyaratan di atas.

Anda dapat menandai satu atau kedua kolom periode dengan bendera TERSEMBUNYI untuk menyembunyikan kolom ini secara implisit sehingga SELECT * FROM<table> tidak mengembalikan nilai untuk kolom tersebut. Secara default, kolom titik tidak disembunyikan. Agar dapat digunakan, kolom tersembunyi harus secara eksplisit disertakan dalam semua kueri yang secara langsung mereferensikan tabel temporal. Untuk mengubah atribut HIDDEN untuk kolom periode yang ada, PERIOD harus dihilangkan dan dibuat ulang dengan bendera tersembunyi yang berbeda.

INDEX index_name [ clustered | NONCLUSTERED ] (column_name [ ASC | DESC ] [ ,... n ] )
Berlaku untuk: SQL Server (SQL Server 2014 (12.x) dan yang lebih baru) dan database Azure SQL.

Menentukan untuk membuat indeks pada tabel. Ini bisa menjadi indeks berkluster, atau indeks non-kluster. Indeks akan berisi kolom yang tercantum, dan akan mengurutkan data dalam urutan naik atau turun.

INDEX index_name CLUSTERED COLUMNSTORE
Berlaku untuk: SQL Server (SQL Server 2014 (12.x) dan yang lebih baru) dan database Azure SQL.

Menentukan untuk menyimpan seluruh tabel dalam format kolom dengan indeks penyimpan kolom berkluster. Ini selalu menyertakan semua kolom dalam tabel. Data tidak diurutkan dalam urutan alfabet atau numerik karena baris diatur untuk mendapatkan manfaat kompresi penyimpan kolom.

INDEX index_name [ NONCLUSTERED ] COLUMNSTORE (column_name [ ,... n ] )
Berlaku untuk: SQL Server (SQL Server 2014 (12.x) dan yang lebih baru) dan database Azure SQL.

Menentukan untuk membuat indeks penyimpan kolom non-kluster pada tabel. Tabel yang mendasar dapat berupa timbunan rowstore atau indeks berkluster, atau dapat menjadi indeks penyimpan kolom berkluster. Dalam semua kasus, membuat indeks penyimpan kolom nonkluster pada tabel menyimpan salinan kedua data untuk kolom dalam indeks.

Indeks penyimpan kolom non-kluster disimpan dan dikelola sebagai indeks penyimpan kolom berkluster. Ini disebut indeks penyimpan kolom non-kluster karena kolom dapat dibatasi dan ada sebagai indeks sekunder pada tabel.

ON partition_scheme_name(column_name)
Menentukan skema partisi yang menentukan grup file tempat partisi indeks yang dipartisi akan dipetakan. Skema partisi harus ada dalam database dengan menjalankan CREATE PARTITION SCHEME atau ALTER PARTITION SCHEME. column_name menentukan kolom tempat indeks yang dipartisi akan dipartisi. Kolom ini harus cocok dengan jenis data, panjang, dan presisi argumen fungsi partisi yang partition_scheme_name gunakan. column_name tidak dibatasi untuk kolom dalam definisi indeks. Kolom apa pun dalam tabel dasar dapat ditentukan, kecuali saat mempartisi indeks UNIQUE, column_name harus dipilih dari antara yang digunakan sebagai kunci unik. Pembatasan ini memungkinkan Mesin Database untuk memverifikasi keunikan nilai kunci dalam satu partisi saja.

Catatan

Saat Anda mempartisi indeks berkluster yang tidak unik, Mesin Database secara default menambahkan kolom partisi ke daftar kunci indeks berkluster, jika belum ditentukan. Saat mempartisi indeks non-unik dan non-kluster, Mesin Database menambahkan kolom partisi sebagai kolom non-kunci (disertakan) indeks, jika belum ditentukan.

Jika partition_scheme_name atau grup file tidak ditentukan dan tabel dipartisi, indeks ditempatkan dalam skema partisi yang sama, menggunakan kolom partisi yang sama, sebagai tabel yang mendasar.

Catatan

Anda tidak dapat menentukan skema partisi pada indeks XML. Jika tabel dasar dipartisi, indeks XML menggunakan skema partisi yang sama dengan tabel.

Untuk informasi selengkapnya tentang indeks partisi, Tabel Terpartisi, dan Indeks.

ON filegroup_name
Membuat indeks yang ditentukan pada grup file yang ditentukan. Jika tidak ada lokasi yang ditentukan dan tabel atau tampilan tidak dipartisi, indeks menggunakan grup file yang sama dengan tabel atau tampilan yang mendasar. Grup file harus sudah ada.

ON "default"
Membuat indeks yang ditentukan pada grup file default.

Istilah default, dalam konteks ini, bukan kata kunci. Ini adalah pengidentifikasi untuk grup file default dan harus dibatasi, seperti pada ON "default" atau ON [default]. Jika "default" ditentukan, QUOTED_IDENTIFIER opsi harus AKTIF untuk sesi saat ini. Ini adalah pengaturan default. Untuk informasi selengkapnya, lihat MENGATUR QUOTED_IDENTIFIER.

[ FILESTREAM_ON |partition_scheme_name { filestream_filegroup_name | "NULL" } ]
Berlaku untuk: SQL Server (SQL Server 2008 R2 dan yang lebih baru).

Menentukan penempatan data FILESTREAM untuk tabel saat indeks berkluster dibuat. Klausa FILESTREAM_ON memungkinkan data FILESTREAM dipindahkan ke grup file atau skema partisi FILESTREAM yang berbeda.

filestream_filegroup_name adalah nama grup file FILESTREAM. Grup file harus memiliki satu file yang ditentukan untuk grup file dengan menggunakan pernyataan CREATE DATABASE atau ALTER DATABASE ; jika tidak, kesalahan akan muncul.

Jika tabel dipartisi, FILESTREAM_ON klausul harus disertakan dan harus menentukan skema partisi grup file FILESTREAM yang menggunakan fungsi partisi dan kolom partisi yang sama dengan skema partisi untuk tabel. Jika tidak, kesalahan akan muncul.

Jika tabel tidak dipartisi, kolom FILESTREAM tidak dapat dipartisi. Data FILESTREAM untuk tabel harus disimpan dalam satu grup file yang ditentukan dalam FILESTREAM_ON klausul .

FILESTREAM_ON NULL dapat ditentukan dalam CREATE INDEX pernyataan jika indeks berkluster sedang dibuat dan tabel tidak berisi kolom FILESTREAM.

Untuk informasi selengkapnya, lihat FILESTREAM.

ROWGUIDCOL
Menunjukkan bahwa kolom baru adalah kolom GUID baris. Hanya satu kolom pengidentifikasi unik per tabel yang dapat ditetapkan sebagai kolom ROWGUIDCOL. Menerapkan properti ROWGUIDCOL memungkinkan kolom dirujuk menggunakan $ROWGUID. Properti ROWGUIDCOL hanya dapat ditetapkan ke kolom pengidentifikasi unik . Kolom tipe data yang ditentukan pengguna tidak dapat ditetapkan dengan ROWGUIDCOL.

Properti ROWGUIDCOL tidak memberlakukan keunikan nilai yang disimpan dalam kolom. ROWGUIDCOL juga tidak secara otomatis menghasilkan nilai untuk baris baru yang disisipkan ke dalam tabel. Untuk menghasilkan nilai unik untuk setiap kolom, gunakan fungsi NEWID atau NEWSEQUENTIALID pada pernyataan INSERT atau gunakan fungsi ini sebagai default untuk kolom.

DIENKRIPSI DENGAN
Menentukan kolom enkripsi dengan menggunakan fitur Always Encrypted.

COLUMN_ENCRYPTION_KEY = key_name
Menentukan kunci enkripsi kolom. Untuk informasi selengkapnya, lihat MEMBUAT KUNCI ENKRIPSI KOLOM.

ENCRYPTION_TYPE = { | DETERMINISTIK ACAK }
Enkripsi deterministik menggunakan metode yang selalu menghasilkan nilai terenkripsi yang sama untuk nilai teks biasa tertentu. Menggunakan enkripsi deterministik memungkinkan pencarian menggunakan perbandingan kesetaraan, pengelompokan, dan menggabungkan tabel menggunakan gabungan kesetaraan berdasarkan nilai terenkripsi, tetapi juga dapat memungkinkan pengguna yang tidak berwenang untuk menebak informasi tentang nilai terenkripsi dengan memeriksa pola di kolom terenkripsi. Menggabungkan dua tabel pada kolom yang dienkripsi secara deterministik hanya dimungkinkan jika kedua kolom dienkripsi menggunakan kunci enkripsi kolom yang sama. Enkripsi deterministik harus menggunakan kolase kolom dengan urutan sortir biner2 untuk kolom karakter.

Enkripsi acak menggunakan metode yang mengenkripsi data dengan cara yang kurang dapat diprediksi. Enkripsi acak lebih aman, tetapi mencegah komputasi dan pengindeksan pada kolom terenkripsi, kecuali instans SQL Server Anda mendukung Always Encrypted dengan enklave aman. Silakan lihat Always Encrypted dengan enklave aman untuk detailnya.

Jika Anda menggunakan Always Encrypted (tanpa enklave aman), gunakan enkripsi deterministik untuk kolom yang akan dicari dengan parameter atau parameter pengelompokan, misalnya nomor ID pemerintah. Gunakan enkripsi acak, untuk data seperti nomor kartu kredit, yang tidak dikelompokkan dengan rekaman lain atau digunakan untuk menggabungkan tabel, dan yang tidak dicari karena Anda menggunakan kolom lain (seperti nomor transaksi) untuk menemukan baris yang berisi kolom terenkripsi yang menarik.

Jika Anda menggunakan Always Encrypted dengan enklave aman, enkripsi acak adalah jenis enkripsi yang direkomendasikan.

Kolom harus berjenis data yang memenuhi syarat.

ALGORITMA
Berlaku untuk: SQL Server (SQL Server 2016 (13.x) dan yang lebih baru).

Harus 'AEAD_AES_256_CBC_HMAC_SHA_256'.

Untuk informasi selengkapnya termasuk batasan fitur, lihat Always Encrypted.

JARANG
Menunjukkan bahwa kolom adalah kolom jarang. Penyimpanan kolom jarang dioptimalkan untuk nilai null. Kolom jarang tidak dapat ditetapkan sebagai NOT NULL. Untuk pembatasan tambahan dan informasi selengkapnya tentang kolom jarang, lihat Menggunakan Kolom Jarang.

DITUTUPI DENGAN ( FUNGSI = 'mask_function')
Berlaku untuk: SQL Server (SQL Server 2016 (13.x) dan yang lebih baru).

Menentukan masker data dinamis. mask_function adalah nama fungsi masking dengan parameter yang sesuai. Tersedia empat fungsi:

  • default()
  • email()
  • parsial()
  • random()

ALTER ANY MASK Memerlukan izin.

Untuk parameter fungsi, lihat Masking Data Dinamis.

FILESTREAM
Berlaku untuk: SQL Server (SQL Server 2008 R2 dan yang lebih baru)

Hanya berlaku untuk kolom varbinary(max). Menentukan penyimpanan FILESTREAM untuk data BLOB varbinary(max).

Tabel juga harus memiliki kolom jenis data pengidentifikasi unik yang memiliki atribut ROWGUIDCOL. Kolom ini tidak boleh mengizinkan nilai null dan harus memiliki batasan kolom tunggal UNIQUE atau PRIMARY KEY. Nilai GUID untuk kolom harus disediakan baik oleh aplikasi saat menyisipkan data, atau dengan batasan DEFAULT yang menggunakan fungsi NEWID ().

Kolom ROWGUIDCOL tidak dapat dihilangkan dan batasan terkait tidak dapat diubah saat ada kolom FILESTREAM yang ditentukan untuk tabel. Kolom ROWGUIDCOL hanya dapat dihilangkan setelah kolom FILESTREAM terakhir dihilangkan.

Saat atribut penyimpanan FILESTREAM ditentukan untuk kolom, semua nilai untuk kolom tersebut disimpan dalam kontainer data FILESTREAM pada sistem file.

MENYUSUN collation_name
Menentukan kolagasi untuk kolom. Nama kolase dapat berupa nama kolase Windows atau nama kolase SQL. collation_name hanya berlaku untuk kolom jenis data karakter, varchar, teks, nchar, nvarchar, dan ntext . Jika tidak ditentukan, kolom ditetapkan baik kolase jenis data yang ditentukan pengguna, jika kolom tersebut berjenis data yang ditentukan pengguna, atau kolase default database.

Untuk informasi selengkapnya tentang nama kolajeasi Windows dan SQL, lihat Nama Kolate Windows dan Nama Kolate SQL.

Untuk informasi selengkapnya, lihat COLLATE.

CONSTRAINT
Adalah kata kunci opsional yang menunjukkan dimulainya definisi KUNCI PRIMER, NOT NULL, UNIQUE, FOREIGN KEY, atau BATASAN CHECK.

constraint_name
Adalah nama batasan. Nama batasan harus unik dalam skema tempat tabel berada.

| NULL NOT NULL
Tentukan apakah nilai null diperbolehkan dalam kolom. NULL bukan batasan yang ketat tetapi dapat ditentukan seperti NOT NULL. NOT NULL dapat ditentukan untuk kolom komputasi hanya jika PERSISTED juga ditentukan.

KUNCI PRIMER
Adalah batasan yang memberlakukan integritas entitas untuk kolom atau kolom tertentu melalui indeks unik. Hanya satu batasan KUNCI PRIMER yang dapat dibuat per tabel.

UNIQUE
Adalah batasan yang menyediakan integritas entitas untuk kolom atau kolom tertentu melalui indeks unik. Tabel dapat memiliki beberapa batasan UNIK.

| TERKLUSTER TIDAK TERKLUSTER
Menunjukkan bahwa indeks terkluster atau non-kluster dibuat untuk batasan PRIMARY KEY atau UNIQUE. BATASAN KUNCI PRIMER default ke CLUSTERED, dan batasan UNIQUE default ke NONCLUSTERED.

Dalam pernyataan CREATE TABLE , CLUSTERED hanya dapat ditentukan untuk satu batasan. Jika CLUSTERED ditentukan untuk batasan UNIQUE dan batasan KUNCI PRIMER juga ditentukan, KUNCI PRIMER default ke NONCLUSTERED.

REFERENSI KUNCI ASING
Adalah batasan yang memberikan integritas referensial untuk data di kolom atau kolom. Batasan FOREIGN KEY mengharuskan setiap nilai dalam kolom ada di kolom atau kolom yang dirujuk terkait dalam tabel yang dirujuk. Batasan FOREIGN KEY hanya dapat mereferensikan kolom yang merupakan batasan PRIMARY KEY atau UNIQUE dalam tabel atau kolom yang dirujuk dalam INDEKS UNIK pada tabel yang dirujuk. Kunci asing pada kolom komputasi juga harus ditandai PERSISTED.

[_schema_name**.**] referenced_table_name]
Adalah nama tabel yang dirujuk oleh batasan KUNCI ASING, dan skema tempat tabel tersebut berada.

(ref_column [ , ...n ] )
Adalah kolom, atau daftar kolom, dari tabel yang dirujuk oleh batasan KUNCI ASING.

ON DELETE { NO ACTION | | CASCADE MENGATUR | NULL ATUR DEFAULT }
Menentukan tindakan apa yang terjadi pada baris dalam tabel yang dibuat, jika baris tersebut memiliki hubungan referensial dan baris yang direferensikan dihapus dari tabel induk. Defaultnya adalah TIDAK ADA TINDAKAN.

TIDAK ADA TINDAKAN
Mesin Database menimbulkan kesalahan dan tindakan hapus pada baris dalam tabel induk digulung balik.

CASCADE
Baris terkait dihapus dari tabel referensi jika baris tersebut dihapus dari tabel induk.

SET NULL
Semua nilai yang membentuk kunci asing diatur ke NULL jika baris terkait dalam tabel induk dihapus. Agar batasan ini dijalankan, kolom kunci asing harus dapat diubah ke null.

ATUR DEFAULT
Semua nilai yang membentuk kunci asing diatur ke nilai defaultnya jika baris terkait dalam tabel induk dihapus. Agar batasan ini dijalankan, semua kolom kunci asing harus memiliki definisi default. Jika kolom dapat diubah ke null, dan tidak ada nilai default eksplisit yang ditetapkan, NULL menjadi nilai default implisit kolom.

Jangan tentukan CASCADE jika tabel akan disertakan dalam publikasi gabungan yang menggunakan rekaman logis. Untuk informasi selengkapnya tentang rekaman logis, lihat Perubahan Grup ke Baris Terkait dengan Rekaman Logis.

ON DELETE CASCADE tidak dapat ditentukan jika pemicu INSTEAD OFON DELETE sudah ada pada tabel.

Misalnya, dalam database AdventureWorks2012 , ProductVendor tabel memiliki hubungan referensial dengan Vendor tabel. Kunci asing ProductVendor.BusinessEntityID mereferensikan kunci primer Vendor.BusinessEntityID .

DELETE Jika pernyataan dijalankan pada baris dalam Vendor tabel, dan ON DELETE CASCADE tindakan ditentukan untuk ProductVendor.BusinessEntityID, Mesin Database memeriksa satu atau beberapa baris dependen dalam ProductVendor tabel. Jika ada, baris dependen dalam ProductVendor tabel akan dihapus, dan juga baris yang dirujuk dalam Vendor tabel.

Sebaliknya, jika NO ACTION ditentukan, Mesin Database menimbulkan kesalahan dan mengembalikan tindakan penghapusan pada baris Vendor jika setidaknya ada satu baris dalam ProductVendor tabel yang mereferensikannya.

ON UPDATE { NO ACTION | CASCADE \ SET NULL | ATUR DEFAULT }
Menentukan tindakan apa yang terjadi pada baris dalam tabel yang diubah ketika baris tersebut memiliki hubungan referensial dan baris yang direferensikan diperbarui dalam tabel induk. Defaultnya adalah TIDAK ADA TINDAKAN.

TIDAK ADA TINDAKAN
Mesin Database menimbulkan kesalahan, dan tindakan pembaruan pada baris dalam tabel induk digulung balik.

CASCADE
Baris terkait diperbarui dalam tabel referensi saat baris tersebut diperbarui dalam tabel induk.

SET NULL
Semua nilai yang membentuk kunci asing diatur ke NULL saat baris terkait dalam tabel induk diperbarui. Agar batasan ini dijalankan, kolom kunci asing harus dapat diubah ke null.

ATUR DEFAULT
Semua nilai yang membentuk kunci asing diatur ke nilai defaultnya saat baris terkait dalam tabel induk diperbarui. Agar batasan ini dijalankan, semua kolom kunci asing harus memiliki definisi default. Jika kolom dapat diubah ke null, dan tidak ada nilai default eksplisit yang ditetapkan, NULL menjadi nilai default implisit kolom.

Jangan tentukan CASCADE apakah tabel akan disertakan dalam publikasi gabungan yang menggunakan rekaman logis. Untuk informasi selengkapnya tentang rekaman logis, lihat Perubahan Grup ke Baris Terkait dengan Rekaman Logis.

ON UPDATE CASCADE, SET NULL, atau SET DEFAULT tidak dapat didefinisikan jika INSTEAD OF pemicu ON UPDATE sudah ada pada tabel yang sedang diubah.

Misalnya, dalam database AdventureWorks2012 , ProductVendor tabel memiliki hubungan referensial dengan Vendor tabel: Kunci asing ProductVendor.BusinessEntity mereferensikan kunci primer Vendor.BusinessEntityID .

Jika pernyataan UPDATE dijalankan pada baris dalam Vendor tabel, dan tindakan ON UPDATE CASCADE ditentukan untuk ProductVendor.BusinessEntityID, Mesin Database memeriksa satu atau beberapa baris dependen dalam ProductVendor tabel. Jika ada, baris dependen dalam tabel diperbarui ProductVendor , dan juga baris yang dirujuk dalam Vendor tabel.

Sebaliknya, jika TIDAK ADA TINDAKAN yang ditentukan, Mesin Database menimbulkan kesalahan dan mengembalikan tindakan pembaruan pada baris Vendor jika setidaknya ada satu baris dalam ProductVendor tabel yang mereferensikannya.

CHECK
Adalah batasan yang memberlakukan integritas domain dengan membatasi kemungkinan nilai yang dapat dimasukkan ke dalam kolom atau kolom. Batasan CHECK pada kolom komputasi juga harus ditandai DENGAN PERSISTED.

logical_expression
Adalah ekspresi logika yang mengembalikan TRUE atau FALSE. Jenis data alias tidak dapat menjadi bagian dari ekspresi.

kolom
Adalah kolom atau daftar kolom, dalam tanda kurung, digunakan dalam batasan tabel untuk menunjukkan kolom yang digunakan dalam definisi batasan.

[ | ASC DESC ]
Menentukan urutan pengurutan kolom atau kolom yang berpartisipasi dalam batasan tabel. Defaultnya adalah ASC.

partition_scheme_name
Adalah nama skema partisi yang mendefinisikan grup file tempat partisi tabel yang dipartisi akan dipetakan. Skema partisi harus ada dalam database.

[_partition_column_name**.** ]
Menentukan kolom tempat tabel yang dipartisi akan dipartisi. Kolom harus cocok dengan yang ditentukan dalam fungsi partisi yang partition_scheme_name gunakan dalam hal jenis data, panjang, dan presisi. Kolom komputasi yang berpartisipasi dalam fungsi partisi harus ditandai secara eksplisit PERSISTED.

Penting

Kami menyarankan agar Anda menentukan NOT NULL pada kolom partisi tabel yang dipartisi, dan juga tabel nonpartisi yang merupakan sumber atau target ALTER TABLE... Operasi SWITCH. Melakukan ini memastikan bahwa batasan CHECK pada kolom partisi tidak harus memeriksa nilai null.

DENGAN fillfactor FILLFACTOR =
Menentukan seberapa lengkap Mesin Database harus membuat setiap halaman indeks yang digunakan untuk menyimpan data indeks. Nilai fillfactor yang ditentukan pengguna bisa dari 1 hingga 100. Jika nilai tidak ditentukan, defaultnya adalah 0. Nilai faktor pengisian 0 dan 100 sama dalam semua hal.

Penting

Dokumentasi DENGAN FILLFACTOR = fillfactor sebagai satu-satunya opsi indeks yang berlaku untuk batasan PRIMARY KEY atau UNIQUE dipertahankan untuk kompatibilitas mundur, tetapi tidak akan didokumenkan dengan cara ini dalam rilis mendatang.

column_set_name COLUMN_SET XML UNTUK ALL_SPARSE_COLUMNS
Adalah nama kumpulan kolom. Kumpulan kolom adalah representasi XML yang tidak ditata yang menggabungkan semua kolom jarang tabel ke dalam output terstruktur. Untuk informasi selengkapnya tentang kumpulan kolom, lihat Menggunakan Kumpulan Kolom.

PERIODE UNTUK SYSTEM_TIME (system_start_time_column_name , system_end_time_column_name )
Berlaku untuk: SQL Server (SQL Server 2016 (13.x) dan yang lebih baru) dan database Azure SQL.

Menentukan nama kolom yang akan digunakan sistem untuk merekam periode rekaman valid. Gunakan argumen ini bersama dengan GENERATED ALWAYS AS ROW { START | END } argumen dan WITH SYSTEM_VERSIONING = ON untuk membuat tabel temporal. Untuk informasi selengkapnya, lihat Tabel Temporal.

COMPRESSION_DELAY
Berlaku untuk: SQL Server (SQL Server 2016 (13.x) dan yang lebih baru) dan database Azure SQL.

Untuk memori yang dioptimalkan, penundaan menentukan jumlah menit minimum baris harus tetap dalam tabel, tidak berubah, sebelum memenuhi syarat untuk pemadatan ke dalam indeks penyimpan kolom. SQL Server memilih baris tertentu untuk dikompresi sesuai dengan waktu pembaruan terakhirnya. Misalnya, jika baris sering berubah selama periode waktu dua jam, Anda dapat mengatur COMPRESSION_DELAY = 120 Minutes untuk memastikan pembaruan selesai sebelum SQL Server memadatkan baris.

Untuk tabel berbasis disk, penundaan menentukan jumlah menit minimum grup baris delta dalam status TERTUTUP harus tetap berada di grup baris delta sebelum SQL Server dapat memadatkannya ke dalam grup baris terkompresi. Karena tabel berbasis disk tidak melacak waktu penyisipan dan pembaruan pada baris individual, SQL Server menerapkan penundaan ke grup baris delta dalam status TERTUTUP.

Defaultnya adalah 0 menit.

Untuk rekomendasi tentang kapan harus menggunakan COMPRESSION_DELAY, silakan lihat Mulai menggunakan Columnstore untuk analitik operasional real time

<> table_option ::=
Menentukan satu atau beberapa opsi tabel.

DATA_COMPRESSION
Menentukan opsi kompresi data untuk tabel, nomor partisi, atau rentang partisi yang ditentukan. Opsinya meliputi:

TIDAK ADA
Tabel atau partisi yang ditentukan tidak dikompresi.

ROW
Tabel atau partisi tertentu dikompresi dengan menggunakan pemadatan baris.

PAGE
Tabel atau partisi tertentu dikompresi dengan menggunakan pemadatan halaman.

PENYIMPAN KOLOM
Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru dan Azure SQL Database.

Hanya berlaku untuk indeks penyimpan kolom, termasuk penyimpan kolom non-kluster dan indeks penyimpan kolom berkluster. COLUMNSTORE menentukan untuk memadatkan dengan pemadatan penyimpan kolom yang paling berkinerja. Ini adalah pilihan umum.

COLUMNSTORE_ARCHIVE
Berlaku untuk: SQL Server (SQL Server 2016 (13.x) dan yang lebih baru) dan database Azure SQL.

Hanya berlaku untuk indeks penyimpan kolom, termasuk penyimpan kolom non-kluster dan indeks penyimpan kolom berkluster. COLUMNSTORE_ARCHIVE akan lebih memadatkan tabel atau partisi ke ukuran yang lebih kecil. Ini dapat digunakan untuk pengarsipan, atau untuk situasi lain yang memerlukan ukuran penyimpanan yang lebih kecil dan dapat memberikan lebih banyak waktu untuk penyimpanan dan pengambilan.

Untuk informasi selengkapnya, lihat Kompresi Data.

XML_COMPRESSION
Berlaku untuk: pratinjau SQL Server 2022 (16.x) dan yang lebih baru, dan pratinjau database Azure SQL.

Menentukan opsi pemadatan XML untuk kolom tipe data xml apa pun dalam tabel. Opsinya meliputi:

AKTIF
Kolom yang menggunakan tipe data xml dikompresi.

TIDAK AKTIF
Kolom yang menggunakan tipe data xml tidak dikompresi.

ON PARTITIONS ( { <partition_number_expression> | [ ,... n ] )
Menentukan partisi yang diterapkan pengaturan DATA_COMPRESSION atau XML_COMPRESSION . Jika tabel tidak dipartisi, ON PARTITIONS argumen akan menghasilkan kesalahan. ON PARTITIONS Jika klausul tidak disediakan, DATA_COMPRESSION opsi akan berlaku untuk semua partisi tabel yang dipartisi.

Catatan

XML_COMPRESSIONhanya tersedia mulai dari Pratinjau SQL Server 2022 (16.x), dan Pratinjau Database Azure SQL.

partition_number_expression dapat ditentukan dengan cara berikut:

  • Berikan nomor partisi partisi, misalnya: ON PARTITIONS (2)
  • Berikan nomor partisi untuk beberapa partisi individual yang dipisahkan oleh koma, misalnya: ON PARTITIONS (1, 5)
  • Berikan rentang dan partisi individual, misalnya: ON PARTITIONS (2, 4, 6 TO 8)

<range> dapat ditentukan sebagai nomor partisi yang dipisahkan oleh kata TO, misalnya: ON PARTITIONS (6 TO 8).

Untuk mengatur berbagai jenis kompresi data untuk partisi yang berbeda, tentukan DATA_COMPRESSION opsi lebih dari sekali, misalnya:

WITH
(
    DATA_COMPRESSION = NONE ON PARTITIONS (1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
)

Anda juga dapat menentukan XML_COMPRESSION opsi lebih dari sekali, misalnya:

WITH
(
  XML_COMPRESSION = OFF ON PARTITIONS (1),
  XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
  XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

<> index_option ::=
Menentukan satu atau beberapa opsi indeks. Untuk deskripsi lengkap tentang opsi ini, lihat MEMBUAT INDEKS.

PAD_INDEX = { ON | OFF }
Ketika ON, persentase ruang kosong yang ditentukan oleh FILLFACTOR diterapkan ke halaman tingkat menengah indeks. Ketika OFF atau nilai FILLFACTOR tidak ditentukan, halaman tingkat menengah diisi ke kapasitas dekat menyisakan cukup ruang untuk setidaknya satu baris dari ukuran maksimum yang dapat dimiliki indeks, dengan mempertimbangkan kumpulan kunci pada halaman perantara. Defaultnya adalah NONAKTIF.

Fillfactor FILLFACTOR =
Menentukan persentase yang menunjukkan seberapa lengkap Mesin Database harus membuat tingkat daun dari setiap halaman indeks selama pembuatan atau perubahan indeks. fillfactor harus berupa nilai bilangan bulat dari 1 hingga 100. Defaultnya adalah 0. Nilai faktor pengisian 0 dan 100 sama dalam semua hal.

IGNORE_DUP_KEY = { ON | OFF }
Menentukan respons kesalahan saat operasi penyisipan mencoba menyisipkan nilai kunci duplikat ke dalam indeks unik. Opsi IGNORE_DUP_KEY hanya berlaku untuk menyisipkan operasi setelah indeks dibuat atau dibangun kembali. Opsi ini tidak berpengaruh saat menjalankan CREATE INDEX, ALTER INDEX, atau UPDATE. Defaultnya adalah NONAKTIF.

AKTIF
Pesan peringatan akan terjadi ketika nilai kunci duplikat dimasukkan ke dalam indeks unik. Hanya baris yang melanggar batasan keunikan yang akan gagal.

TIDAK AKTIF
Pesan kesalahan akan terjadi ketika nilai kunci duplikat dimasukkan ke dalam indeks unik. Seluruh operasi INSERT akan digulung balik.

IGNORE_DUP_KEY tidak dapat diatur ke AKTIF untuk indeks yang dibuat pada tampilan, indeks non-unik, indeks XML, indeks spasial, dan indeks yang difilter.

Untuk melihat IGNORE_DUP_KEY, gunakan sys.indexes.

Dalam sintaksis kompatibel mundur, WITH IGNORE_DUP_KEY setara dengan WITH IGNORE_DUP_KEY = ON.

= STATISTICS_NORECOMPUTE { ON | OFF }
Saat AKTIF, statistik indeks yang sudah kedaluarsa tidak dikomputasi ulang secara otomatis. Saat NONAKTIF, pembaruan statistik otomatis diaktifkan. Defaultnya adalah NONAKTIF.

= ALLOW_ROW_LOCKS { ON | OFF }
Saat AKTIF, kunci baris diizinkan saat Anda mengakses indeks. Mesin Database menentukan kapan kunci baris digunakan. Saat NONAKTIF, kunci baris tidak digunakan. Defaultnya adalah AKTIF.

= ALLOW_PAGE_LOCKS { ON | OFF }
Saat AKTIF, kunci halaman diizinkan saat Anda mengakses indeks. Mesin Database menentukan kapan kunci halaman digunakan. Saat OFF, kunci halaman tidak digunakan. Defaultnya adalah AKTIF.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2019 (15.x)), Azure SQL Database, dan Azure SQL Managed Instance.
Menentukan apakah akan mengoptimalkan ketidakcocokan sisipan halaman terakhir atau tidak. Defaultnya adalah NONAKTIF. Lihat bagian Kunci Berurutan dari halaman CREATE INDEX untuk informasi selengkapnya.

FILETABLE_DIRECTORY = directory_name
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2012 (11.x)).

Menentukan nama direktori FileTable yang kompatibel dengan windows. Nama ini harus unik di antara semua nama direktori FileTable dalam database. Perbandingan keunikan tidak peka huruf besar/kecil, terlepas dari pengaturan kolase. Jika nilai ini tidak ditentukan, nama filetable akan digunakan.

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2012 (11.x)). Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILETABLE.

Menentukan nama kolase yang akan diterapkan ke kolom Nama di FileTable. Kolase harus tidak peka huruf besar/kecil untuk mematuhi semantik penamaan file sistem operasi Windows. Jika nilai ini tidak ditentukan, kolatasi default database akan digunakan. Jika kolatasi default database peka huruf besar/kecil, kesalahan dimunculkan dan operasi CREATE TABLE gagal.

collation_name
Nama kolater yang tidak peka huruf besar/kecil.

database_default
Menentukan bahwa kolase default untuk database harus digunakan. Kolase ini harus tidak peka huruf besar/kecil.

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2012 (11.x)). Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILETABLE.

Menentukan nama yang akan digunakan untuk batasan kunci primer yang secara otomatis dibuat pada FileTable. Jika nilai ini tidak ditentukan, sistem akan menghasilkan nama untuk batasan.

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_nameBerlaku untuk: SQL Server (Dimulai dengan SQL Server 2012 (11.x)). Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILETABLE.

Menentukan nama yang akan digunakan untuk batasan unik yang secara otomatis dibuat pada kolom stream_id di FileTable. Jika nilai ini tidak ditentukan, sistem akan menghasilkan nama untuk batasan.

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_nameBerlaku untuk: SQL Server (Dimulai dengan SQL Server 2012 (11.x)). Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILETABLE.

Menentukan nama yang akan digunakan untuk batasan unik yang secara otomatis dibuat pada kolom parent_path_locator dan nama di FileTable. Jika nilai ini tidak ditentukan, sistem akan menghasilkan nama untuk batasan.

= SYSTEM_VERSIONING AKTIF [ ( HISTORY_TABLE =schema_name . history_table_name [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ] Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)), database Azure SQL, dan Azure SQL Managed Instance.

Mengaktifkan penerapan versi sistem tabel jika tipe data, batasan nullability, dan persyaratan batasan kunci primer terpenuhi. Sistem akan merekam riwayat setiap rekaman dalam tabel versi sistem dalam tabel riwayat terpisah. HISTORY_TABLE Jika argumen tidak digunakan, nama tabel riwayat ini akan menjadi MSSQL_TemporalHistoryFor<primary_table_object_id>. Jika nama tabel riwayat ditentukan selama pembuatan tabel riwayat, Anda harus menentukan skema dan nama tabel. Jika tabel riwayat tidak ada, sistem menghasilkan tabel riwayat baru yang cocok dengan skema tabel saat ini dalam grup file yang sama dengan tabel saat ini, membuat tautan antara dua tabel dan memungkinkan sistem merekam riwayat setiap rekaman dalam tabel saat ini dalam tabel riwayat. Secara default, tabel riwayat dikompresi HALAMAN . HISTORY_TABLE Jika argumen digunakan untuk membuat tautan ke dan menggunakan tabel riwayat yang ada, tautan dibuat antara tabel saat ini dan tabel yang ditentukan. Jika tabel saat ini dipartisi, tabel riwayat dibuat pada grup file default karena konfigurasi partisi tidak direplikasi secara otomatis dari tabel saat ini ke tabel riwayat. Saat membuat tautan ke tabel riwayat yang sudah ada, Anda bisa memilih untuk melakukan pemeriksaan konsistensi data. Pemeriksaan konsistensi data ini memastikan bahwa rekaman yang ada tidak tumpang tindih. Melakukan pemeriksaan konsistensi data adalah default. Gunakan argumen ini bersama dengan PERIOD FOR SYSTEM_TIME argumen dan GENERATED ALWAYS AS ROW { START | END } untuk mengaktifkan penerapan versi sistem pada tabel. Untuk informasi selengkapnya, lihat Tabel Temporal. Gunakan argumen ini dengan WITH LEDGER = ON argumen untuk membuat tabel ledger yang dapat diperbarui. Menggunakan tabel riwayat yang ada dengan tabel ledger tidak diperbolehkan.

REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [,... n] ) ] | OFF ( MIGRATION_STATE = DIJEDA ) }
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)).

Membuat tabel baru dengan Stretch Database diaktifkan atau dinonaktifkan. Untuk informasi selengkapnya, lihat Stretch Database.

Penting

Stretch Database tidak digunakan lagi dalam Pratinjau SQL Server 2022 (16.x). Fitur ini akan dihapus dalam versi Microsoft SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.

Mengaktifkan Stretch Database untuk tabel

Saat Anda mengaktifkan Stretch untuk tabel dengan menentukan ON, Anda dapat secara opsional menentukan MIGRATION_STATE = OUTBOUND untuk segera mulai memigrasikan data, atau MIGRATION_STATE = PAUSED untuk menunda migrasi data. Nilai defaultnya adalah MIGRATION_STATE = OUTBOUND. Untuk informasi selengkapnya tentang mengaktifkan Stretch untuk tabel, lihat Mengaktifkan Stretch Database untuk tabel.

Prasyarat. Sebelum mengaktifkan Stretch untuk tabel, Anda harus mengaktifkan Stretch di server dan di database. Untuk informasi selengkapnya, lihat Mengaktifkan Stretch Database untuk database.

Izin. Mengaktifkan Stretch untuk database atau tabel memerlukan izin db_owner. Mengaktifkan Stretch untuk tabel juga memerlukan izin ALTER pada tabel.

[ FILTER_PREDICATE = { NULL | predikat } ]
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)).

Secara opsional menentukan predikat filter untuk memilih baris yang akan dimigrasikan dari tabel yang berisi data historis dan saat ini. Predikat harus memanggil fungsi bernilai tabel sebaris deterministik. Untuk informasi selengkapnya, lihat Mengaktifkan Stretch Database untuk tabel dan Memilih baris untuk dimigrasikan dengan menggunakan fungsi filter.

Penting

Jika Anda memberikan predikat filter yang berkinerja buruk, migrasi data juga berkinerja buruk. Stretch Database menerapkan predikat filter ke tabel dengan menggunakan operator CROSS APPLY.

Jika Anda tidak menentukan predikat filter, seluruh tabel akan dimigrasikan.

Saat Menentukan predikat filter, Anda juga harus menentukan MIGRATION_STATE.

MIGRATION_STATE = { | KELUAR | MASUK DIJEDA }
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)), Azure SQL Database, dan Azure SQL Managed Instance.

[ DATA_DELETION = AKTIF
{ ( FILTER_COLUMN = column_name,
RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | | MINGGU | MINGGU | BULAN BULAN | | TAHUN YEARS } ) } ] Berlaku untuk:hanya Azure SQL Edge

Memungkinkan pembersihan berbasis kebijakan penyimpanan data lama atau lama dari tabel dalam database. Untuk informasi selengkapnya, lihat Mengaktifkan dan Menonaktifkan Retensi Data. Parameter berikut harus ditentukan agar retensi data diaktifkan.

  • FILTER_COLUMN = { column_name }
    Menentukan kolom, yang harus digunakan untuk menentukan apakah baris dalam tabel sudah usang atau tidak. Jenis data berikut diperbolehkan untuk kolom filter.

    • Date
    • DateTime
    • DateTime2
    • SmallDateTime
    • DateTimeOffset
  • RETENTION_PERIOD = { INFINITE | nomor {DAY | DAYS | | MINGGU | MINGGU | BULAN BULAN | | TAHUN TAHUN }}
    Menentukan kebijakan periode retensi untuk tabel. Periode retensi ditentukan sebagai kombinasi dari nilai bilangan bulat positif dan unit bagian tanggal.

MEMORY_OPTIMIZED
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2014 (12.x)), Azure SQL Database, dan Azure SQL Managed Instance. Azure SQL Managed Instance tidak mendukung tabel memori yang dioptimalkan di tingkat Tujuan Umum.

Nilai AKTIF menunjukkan bahwa tabel dioptimalkan untuk memori. Tabel yang dioptimalkan memori adalah bagian dari fitur In-Memory OLTP, yang digunakan untuk mengoptimalkan performa pemrosesan transaksi. Untuk mulai menggunakan In-Memory OLTP, lihat Mulai Cepat 1: In-Memory Teknologi OLTP untuk Performa Transact-SQL yang Lebih Cepat. Untuk informasi lebih mendalam tentang tabel yang dioptimalkan memori, lihat Tabel yang Dioptimalkan Memori.

Nilai default NONAKTIF menunjukkan bahwa tabel berbasis disk.

DAYA TAHAN
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2014 (12.x)), Azure SQL Database, dan Azure SQL Managed Instance.

Nilai SCHEMA_AND_DATA menunjukkan bahwa tabel tahan lama, yang berarti bahwa perubahan tetap ada pada disk dan bertahan hidupkan ulang atau failover. SCHEMA_AND_DATA adalah nilai default.

Nilai SCHEMA_ONLY menunjukkan bahwa tabel tidak tahan lama. Skema tabel tetap ada tetapi pembaruan data apa pun tidak dipertahankan saat menghidupkan ulang atau failover database. DURABILITY = SCHEMA_ONLY hanya diperbolehkan dengan MEMORY_OPTIMIZED = ON.

Peringatan

Saat tabel dibuat dengan DURABILITY = SCHEMA_ONLY, dan READ_COMMITTED_SNAPSHOT kemudian diubah menggunakan ALTER DATABASE, data dalam tabel akan hilang.

BUCKET_COUNT
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2014 (12.x), Azure SQL Database, dan Azure SQL Managed Instance.

Menunjukkan jumlah wadah yang harus dibuat dalam indeks hash. Nilai maksimum untuk BUCKET_COUNT dalam indeks hash adalah 1.073.741.824. Untuk informasi selengkapnya tentang jumlah wadah, lihat Indeks untuk tabel Memory-Optimized.

Bucket_count adalah argumen yang diperlukan.

INDEX
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2014 (12.x)), Azure SQL Database, dan Azure SQL Managed Instance.

Indeks kolom dan tabel dapat ditentukan sebagai bagian dari pernyataan CREATE TABLE. Untuk detail tentang menambahkan dan menghapus indeks pada tabel yang dioptimalkan memori, lihat Mengubah Tabel Memory-Optimized

HASH
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2014 (12.x)), Azure SQL Database, dan Azure SQL Managed Instance.

Menunjukkan bahwa indeks HASH dibuat.

Indeks hash hanya didukung pada tabel yang dioptimalkan memori.

LEDGER = AKTIF ( <ledger_option> [, ... n ] ) | Off
Berlaku untuk: SQL Server 2022, Azure SQL Database.

Catatan

Jika pernyataan membuat tabel ledger, ENABLE LEDGER izin diperlukan.

Menunjukkan apakah tabel yang sedang dibuat adalah tabel ledger (ON) atau tidak (OFF). Defaultnya adalah NONAKTIF. APPEND_ONLY = ON Jika opsi ditentukan, sistem membuat tabel ledger khusus tambahan yang hanya memungkinkan menyisipkan baris baru. Jika tidak, sistem membuat tabel ledger yang dapat diperbarui. Tabel ledger yang dapat diperbarui juga memerlukan SYSTEM_VERSIONING = ON argumen . Tabel ledger yang dapat diperbarui juga harus berupa tabel versi sistem. Namun, tabel ledger yang dapat diperbarui tidak harus tabel temporal (tidak memerlukan PERIOD FOR SYSTEM_TIME parameter ). Jika tabel riwayat ditentukan dengan LEDGER = ON dan SYSTEM_VERSIONING = ON, tabel tersebut tidak boleh mereferensikan tabel yang sudah ada.

Database ledger (database yang dibuat dengan LEDGER = ON opsi ) hanya memungkinkan pembuatan tabel ledger. Upaya untuk membuat tabel dengan LEDGER = OFF akan menimbulkan kesalahan. Setiap tabel baru secara default dibuat sebagai tabel ledger yang dapat diperbarui, bahkan jika Anda tidak menentukan LEDGER = ON, dan akan dibuat dengan nilai default untuk semua parameter lainnya.

Tabel ledger yang dapat diperbarui harus berisi empat GENERATED ALWAYS kolom, tepat satu kolom yang ditentukan dengan masing-masing argumen berikut:

  • ALWAYS AS TRANSACTION_ID START YANG DIHASILKAN
  • ALWAYS AS TRANSACTION_ID END YANG DIHASILKAN
  • ALWAYS AS SEQUENCE_NUMBER START YANG DIHASILKAN
  • ALWAYS AS SEQUENCE_NUMBER END YANG DIHASILKAN

Tabel ledger khusus tambahan harus berisi satu kolom yang ditentukan dengan masing-masing argumen berikut:

  • ALWAYS AS TRANSACTION_ID START YANG DIHASILKAN
  • ALWAYS AS SEQUENCE_NUMBER START YANG DIHASILKAN

Jika salah satu kolom selalu yang dihasilkan yang diperlukan tidak ditentukan dalam CREATE TABLE pernyataan dan pernyataan menyertakan LEDGER = ON, sistem akan secara otomatis mencoba menambahkan kolom menggunakan definisi kolom yang berlaku dari daftar di bawah ini. Jika ada konflik nama dengan kolom yang sudah ditentukan, sistem akan memunculkan kesalahan.

  • [ledger_start_transaction_id] BIGINT DIHASILKAN SELALU SEBAGAI TRANSACTION_ID MULAI TERSEMBUNYI TIDAK NULL
  • [ledger_end_transaction_id] BIGINT SELALU DIHASILKAN SEBAGAI TRANSACTION_ID AKHIRI HIDDEN NULL
  • [ledger_start_sequence_number] BIGINT DIHASILKAN SELALU SEBAGAI SEQUENCE_NUMBER MULAI TERSEMBUNYI TIDAK NULL
  • [ledger_end_sequence_number] BIGINT MENGHASILKAN ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL

<ledger_view_option> menentukan skema dan nama tampilan ledger yang secara otomatis dibuat dan ditautkan ke tabel. Jika opsi tidak ditentukan, sistem menghasilkan nama tampilan ledger dengan menambahkan _Ledger ke nama tabel yang sedang dibuat (database_name.schema_name.table_name). Jika tampilan dengan nama yang ditentukan atau dihasilkan ada, sistem akan menimbulkan kesalahan. Jika tabel adalah tabel ledger yang dapat diperbarui, tampilan ledger dibuat sebagai union pada tabel dan tabel riwayatnya. Setiap baris dalam tampilan ledger mewakili pembuatan atau penghapusan versi baris dalam tabel ledger. Tampilan ledger berisi semua kolom tabel ledger, kecuali kolom always yang dihasilkan yang tercantum di atas. Tampilan ledger juga berisi kolom tambahan berikut:

Nama kolom Jenis data Deskripsi
Ditentukan menggunakan TRANSACTION_ID_COLUMN_NAME opsi . ledger_transaction_id jika tidak ditentukan. bigint ID transaksi yang membuat atau menghapus versi baris.
Ditentukan menggunakan SEQUENCE_NUMBER_COLUMN_NAME opsi . ledger_sequence_number jika tidak ditentukan. bigint Jumlah urutan operasi tingkat baris dalam transaksi pada tabel.
Ditentukan menggunakan OPERATION_TYPE_COLUMN_NAME opsi . ledger_operation_type jika tidak ditentukan. tinyint Berisi 1 (INSERT) atau 2 (DELETE). Memasukkan baris pada tabel ledger menghasilkan baris baru pada tampilan ledger yang berisi 1 pada kolom ini. Menghapus baris pada tabel ledger menghasilkan baris baru pada tampilan ledger yang berisi 2 pada kolom ini. Memperbarui baris dalam tabel ledger menghasilkan dua baris baru dalam tampilan ledger. Satu baris berisi 2 (DELETE) dan baris lainnya berisi 1 (INSERT) pada kolom ini.
Ditentukan menggunakan OPERATION_TYPE_DESC_COLUMN_NAME opsi . ledger_operation_type_desc jika tidak ditentukan. nvarchar(128) Berisi INSERT atau DELETE. Lihat informasi di atas untuk detailnya.

Transaksi yang mencakup pembuatan tabel ledger diambil dalam sys.database_ledger_transactions.

<ledger_option>::= Menentukan opsi ledger.

  • [ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [,...n ] ) ] Menentukan nama tampilan ledger dan nama kolom tambahan yang ditambahkan sistem ke tampilan ledger.
  • [ APPEND_ONLY = ON | OFF ] Menentukan apakah tabel ledger yang sedang dibuat hanya ditambahkan atau dapat diperbarui. Defaultnya adalah OFF.

<ledger_view_option>::= Menentukan satu atau beberapa opsi tampilan ledger. Setiap opsi tampilan ledger menentukan nama kolom, sistem akan menambahkan ke tampilan, selain kolom yang ditentukan dalam tabel ledger.

  • [ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ] Menentukan nama kolom yang menyimpan ID transaksi yang membuat atau menghapus versi baris. Nama kolom default adalah ledger_transaction_id.
  • [ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ] Menentukan nama kolom yang menyimpan nomor urut operasi tingkat baris dalam transaksi pada tabel. Nama kolom default adalah ledger_sequence_number.
  • [ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name] Menentukan nama kolom yang menyimpan ID jenis operasi. Nama kolom default adalah ledger_operation_type. - [ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ] Menentukan nama kolom yang menyimpan deskripsi jenis operasi. Nama kolom default adalah ledger_operation_type_desc.

Keterangan

Untuk informasi tentang jumlah tabel, kolom, batasan, dan indeks yang diizinkan, lihat Spesifikasi Kapasitas Maksimum untuk SQL Server.

Ruang umumnya dialokasikan untuk tabel dan indeks dalam kenaikan satu tingkat pada satu waktu. SET MIXED_PAGE_ALLOCATION Ketika opsi ALTER DATABASE diatur ke TRUE, atau selalu sebelum SQL Server 2016 (13.x), ketika tabel atau indeks dibuat, itu dialokasikan halaman dari tingkat campuran sampai memiliki cukup halaman untuk mengisi tingkat seragam. Setelah memiliki cukup halaman untuk mengisi tingkat yang seragam, jangkauan lain dialokasikan setiap kali tingkat yang dialokasikan saat ini menjadi penuh. Untuk laporan tentang jumlah ruang yang dialokasikan dan digunakan oleh tabel, jalankan sp_spaceused.

Mesin Database tidak memberlakukan urutan di mana batasan DEFAULT, IDENTITY, ROWGUIDCOL, atau kolom ditentukan dalam definisi kolom.

Saat tabel dibuat, opsi PENGIDENTIFIKASI DIKUTIP selalu disimpan sebagai AKTIF dalam metadata untuk tabel, bahkan jika opsi diatur ke NONAKTIF saat tabel dibuat.

Tabel Sementara

Anda dapat membuat tabel sementara lokal dan global. Tabel sementara lokal hanya terlihat dalam sesi saat ini, dan tabel sementara global terlihat oleh semua sesi. Tabel sementara tidak dapat dipartisi.

Awali nama tabel sementara lokal dengan tanda angka tunggal (#table_name), dan awali nama tabel sementara global dengan tanda angka ganda (##table_name).

Pernyataan Transact-SQL mereferensikan tabel sementara dengan menggunakan nilai yang ditentukan untuk table_name dalam CREATE TABLE pernyataan, misalnya:

CREATE TABLE #MyTempTable (
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

Jika lebih dari satu tabel sementara dibuat di dalam satu prosedur atau batch tersimpan, tabel tersebut harus memiliki nama yang berbeda.

Jika Anda menyertakan schema_name saat membuat atau mengakses tabel sementara, tabel tersebut akan diabaikan. Semua tabel sementara dibuat dalam skema dbo.

Jika tabel sementara lokal dibuat dalam prosedur atau aplikasi tersimpan yang dapat dijalankan pada saat yang sama dengan beberapa sesi, Mesin Database harus dapat membedakan tabel yang dibuat oleh sesi yang berbeda. Mesin Database melakukan ini dengan menambahkan akhiran numerik secara internal ke setiap nama tabel sementara lokal. Nama lengkap tabel sementara seperti yang disimpan dalam sys.sysobjects tabel di tempdb terdiri dari nama tabel yang ditentukan dalam pernyataan CREATE TABLE dan akhiran numerik yang dihasilkan sistem. Untuk mengizinkan akhiran, table_name yang ditentukan untuk nama sementara lokal tidak boleh melebihi 116 karakter.

Tabel sementara secara otomatis dihilangkan saat keluar dari cakupan, kecuali secara eksplisit dihilangkan dengan menggunakan DROP TABLE:

  • Tabel sementara lokal yang dibuat dalam prosedur tersimpan dihilangkan secara otomatis saat prosedur tersimpan selesai. Tabel dapat direferensikan oleh prosedur tersimpan berlapis yang dijalankan oleh prosedur tersimpan yang membuat tabel. Tabel tidak dapat direferensikan oleh proses yang disebut prosedur tersimpan yang membuat tabel.
  • Semua tabel sementara lokal lainnya dihilangkan secara otomatis di akhir sesi saat ini.
  • Tabel sementara global secara otomatis dihilangkan ketika sesi yang membuat tabel berakhir dan semua tugas lain telah berhenti merujuknya. Hubungan antara tugas dan tabel dipertahankan hanya untuk kehidupan satu pernyataan Transact-SQL. Ini berarti bahwa tabel sementara global dihilangkan pada penyelesaian pernyataan Transact-SQL terakhir yang secara aktif mereferensikan tabel ketika sesi pembuatan berakhir.

Tabel sementara lokal yang dibuat dalam prosedur atau pemicu tersimpan dapat memiliki nama yang sama dengan tabel sementara yang dibuat sebelum prosedur atau pemicu tersimpan dipanggil. Namun, jika kueri mereferensikan tabel sementara dan dua tabel sementara dengan nama yang sama ada pada saat itu, itu tidak ditentukan tabel mana yang diselesaikan kueri. Prosedur tersimpan berlapis juga dapat membuat tabel sementara dengan nama yang sama dengan tabel sementara yang dibuat oleh prosedur tersimpan yang menyebutnya. Namun, agar modifikasi diselesaikan ke tabel yang dibuat dalam prosedur berlapis, tabel harus memiliki struktur yang sama, dengan nama kolom yang sama, seperti tabel yang dibuat dalam prosedur panggilan. Hal ini ditunjukkan di contoh berikut.

CREATE PROCEDURE dbo.Test2
AS
    CREATE TABLE #t (x INT PRIMARY KEY);
    INSERT INTO #t VALUES (2);
    SELECT Test2Col = x FROM #t;
GO

CREATE PROCEDURE dbo.Test1
AS
    CREATE TABLE #t (x INT PRIMARY KEY);
    INSERT INTO #t VALUES (1);
    SELECT Test1Col = x FROM #t;
    EXEC Test2;
GO

CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;
GO

Berikut adalah hasil yang ditetapkan.

(1 row(s) affected)
Test1Col
-----------
1

(1 row(s) affected)
 Test2Col
 -----------
 2

Saat Anda membuat tabel sementara lokal atau global, CREATE TABLE sintaks mendukung definisi batasan kecuali untuk batasan KUNCI ASING. Jika batasan FOREIGN KEY ditentukan dalam tabel sementara, pernyataan mengembalikan pesan peringatan yang menyatakan batasan dilewati. Tabel masih dibuat tanpa batasan FOREIGN KEY. Tabel sementara tidak dapat dirujuk dalam batasan KUNCI ASING.

Jika tabel sementara dibuat dengan batasan bernama dan tabel sementara dibuat dalam cakupan transaksi yang ditentukan pengguna, hanya satu pengguna pada waktu tertentu yang dapat mengeksekusi pernyataan yang membuat tabel sementara. Misalnya, jika prosedur tersimpan membuat tabel sementara dengan batasan kunci primer bernama, prosedur tersimpan tidak akan dapat dijalankan secara bersamaan oleh beberapa pengguna.

Database mencakup tabel sementara global (Azure SQL Database)

Tabel sementara global untuk SQL Server (dimulai dengan ## nama tabel) disimpan dalam tempdb dan dibagikan di antara semua sesi pengguna di seluruh instans SQL Server. Untuk informasi tentang jenis tabel SQL, lihat bagian di atas tentang Buat Tabel.

Azure SQL Database mendukung tabel sementara global yang juga disimpan dalam tempdb dan terlingkup ke tingkat database. Ini berarti bahwa tabel sementara global dibagikan untuk semua sesi pengguna dalam database Azure SQL yang sama. Sesi pengguna dari database lain tidak dapat mengakses tabel sementara global.

Tabel sementara global untuk Azure SQL Database mengikuti sintaks dan semantik yang sama dengan yang SQL Server gunakan untuk tabel sementara. Demikian pula, prosedur tersimpan sementara global juga terlingkup ke tingkat database di Azure SQL Database. Tabel sementara lokal (dimulai dengan # nama tabel) juga didukung untuk Azure SQL Database dan mengikuti sintaks dan semantik yang sama yang SQL Server gunakan. Lihat bagian di atas pada Tabel Sementara.

Penting

Fitur ini tersedia untuk Azure SQL Database.

Pemecahan masalah tabel sementara global untuk database Azure SQL

Untuk pemecahan masalah tempdb, lihat Cara Memantau penggunaan tempdb.

Catatan

Hanya admin server yang dapat mengakses DMV pemecahan masalah di Azure SQL Database.

Izin

Setiap pengguna dapat membuat objek sementara global. Pengguna hanya dapat mengakses objek mereka sendiri, kecuali mereka menerima izin tambahan.

Tabel berpartisi

Sebelum membuat tabel yang dipartisi dengan menggunakan CREATE TABLE, Anda harus terlebih dahulu membuat fungsi partisi untuk menentukan bagaimana tabel menjadi dipartisi. Fungsi partisi dibuat dengan menggunakan CREATE PARTITION FUNCTION. Kedua, Anda harus membuat skema partisi untuk menentukan grup file yang akan menyimpan partisi yang ditunjukkan oleh fungsi partisi. Skema partisi dibuat dengan menggunakan CREATE PARTITION SCHEME. Penempatan KUNCI PRIMER atau batasan UNIK untuk memisahkan grup file tidak dapat ditentukan untuk tabel yang dipartisi. Untuk informasi selengkapnya, lihat Tabel dan Indeks yang Dipartisi.

Batasan KUNCI PRIMER

  • Tabel hanya dapat berisi satu batasan KUNCI PRIMER.

  • Indeks yang dihasilkan oleh batasan PRIMARY KEY tidak dapat menyebabkan jumlah indeks pada tabel melebihi 999 indeks non-kluster dan 1 indeks berkluster.

  • Jika CLUSTERED atau NONCLUSTERED tidak ditentukan untuk batasan KUNCI PRIMER, CLUSTERED digunakan jika tidak ada indeks berkluster yang ditentukan untuk batasan UNIQUE.

  • Semua kolom yang ditentukan dalam batasan KUNCI PRIMER harus didefinisikan sebagai NOT NULL. Jika kemampuan null tidak ditentukan, semua kolom yang berpartisipasi dalam batasan KUNCI PRIMER memiliki kemampuan null yang diatur ke NOT NULL.

    Catatan

    Untuk tabel yang dioptimalkan memori, kolom kunci yang dapat diubah ke null diizinkan.

  • Jika kunci primer ditentukan pada kolom jenis yang ditentukan pengguna CLR, implementasi jenis tersebut harus mendukung pengurutan biner. Untuk informasi selengkapnya, lihat Jenis User-Defined CLR.

Batasan UNIK

  • Jika CLUSTERED atau NONCLUSTERED tidak ditentukan untuk batasan UNIQUE, NONCLUSTERED digunakan secara default.
  • Setiap batasan UNIQUE menghasilkan indeks. Jumlah batasan UNIK tidak dapat menyebabkan jumlah indeks pada tabel melebihi 999 indeks non-kluster dan 1 indeks berkluster.
  • Jika batasan unik ditentukan pada kolom jenis yang ditentukan pengguna CLR, implementasi jenis tersebut harus mendukung pengurutan berbasis biner atau operator. Untuk informasi selengkapnya, lihat Jenis User-Defined CLR.

Batasan KUNCI ASING

  • Ketika nilai selain NULL dimasukkan ke dalam kolom batasan KUNCI ASING, nilai harus ada di kolom yang direferensikan; jika tidak, pesan kesalahan pelanggaran kunci asing dikembalikan.

  • Batasan KUNCI ASING diterapkan ke kolom sebelumnya, kecuali kolom sumber ditentukan.

  • Batasan FOREIGN KEY hanya dapat mereferensikan tabel dalam database yang sama di server yang sama. Integritas referensial lintas database harus diimplementasikan melalui pemicu. Untuk informasi selengkapnya, lihat MEMBUAT PEMICU.

  • Batasan FOREIGN KEY dapat mereferensikan kolom lain dalam tabel yang sama. Ini disebut sebagai referensi mandiri.

  • Klausa REFERENCES dari batasan FOREIGN KEY tingkat kolom hanya dapat mencantumkan satu kolom referensi. Kolom ini harus memiliki jenis data yang sama dengan kolom tempat batasan ditentukan.

  • Klausa REFERENCES dari batasan FOREIGN KEY tingkat tabel harus memiliki jumlah kolom referensi yang sama dengan jumlah kolom dalam daftar kolom batasan. Jenis data setiap kolom referensi juga harus sama dengan kolom terkait dalam daftar kolom. Kolom referensi harus ditentukan dalam urutan yang sama dengan yang digunakan saat menentukan kolom kunci primer atau batasan unik pada tabel yang dirujuk.

  • CASCADE, SET NULL, atau SET DEFAULT tidak dapat ditentukan jika kolom tanda waktu jenis adalah bagian dari kunci asing atau kunci yang dirujuk.

  • CASCADE, SET NULL, SET DEFAULT, dan NO ACTION dapat digabungkan pada tabel yang memiliki hubungan referensial satu sama lain. Jika Mesin Database tidak menemukan TINDAKAN, mesin akan berhenti dan mengembalikan tindakan CASCADE terkait, MENGATUR NULL, dan MENGATUR DEFAULT. Ketika pernyataan DELETE menyebabkan kombinasi TINDAKAN CASCADE, SET NULL, SET DEFAULT, dan NO ACTION, semua tindakan CASCADE, SET NULL, dan SET DEFAULT diterapkan sebelum Mesin Database memeriksa TINDAKAN TIDAK ADA.

  • Mesin Database tidak memiliki batas yang telah ditentukan sebelumnya pada jumlah batasan KUNCI ASING tabel dapat berisi referensi tabel lain, atau jumlah batasan KUNCI ASING yang dimiliki oleh tabel lain yang mereferensikan tabel tertentu.

    Namun demikian, jumlah sebenarnya dari batasan KUNCI ASING yang dapat digunakan dibatasi oleh konfigurasi perangkat keras dan dengan desain database dan aplikasi. Sebaiknya tabel berisi tidak lebih dari 253 batasan KUNCI ASING, dan dirujuk oleh tidak lebih dari 253 batasan KUNCI ASING. Batas efektif untuk Anda mungkin lebih atau kurang tergantung pada aplikasi dan perangkat keras. Pertimbangkan biaya pemberlakuan batasan KUNCI ASING saat Anda merancang database dan aplikasi Anda.

  • Batasan KUNCI ASING tidak diberlakukan pada tabel sementara.

  • Batasan FOREIGN KEY hanya dapat mereferensikan kolom di KUNCI PRIMER atau batasan UNIK dalam tabel yang dirujuk atau dalam INDEKS UNIK pada tabel yang dirujuk.

  • Jika kunci asing didefinisikan pada kolom jenis yang ditentukan pengguna CLR, implementasi jenis tersebut harus mendukung pengurutan biner. Untuk informasi selengkapnya, lihat Jenis User-Defined CLR.

  • Kolom yang berpartisipasi dalam hubungan kunci asing harus ditentukan dengan panjang dan skala yang sama.

Definisi DEFAULT

  • Kolom hanya dapat memiliki satu definisi DEFAULT.

  • Definisi DEFAULT dapat berisi nilai konstanta, fungsi, fungsi niladik standar SQL, atau NULL. Tabel berikut ini memperlihatkan fungsi niladik dan nilai yang dikembalikan untuk default selama pernyataan INSERT.

    Fungsi niladik SQL-92 Nilai yang dikembalikan
    CURRENT_TIMESTAMP Tanggal dan waktu saat ini.
    CURRENT_USER Nama pengguna yang melakukan penyisipan.
    SESSION_USER Nama pengguna yang melakukan penyisipan.
    SYSTEM_USER Nama pengguna yang melakukan penyisipan.
    USER Nama pengguna yang melakukan penyisipan.
  • constant_expression dalam definisi DEFAULT tidak dapat merujuk ke kolom lain dalam tabel, atau ke tabel, tampilan, atau prosedur tersimpan lainnya.

  • Definisi DEFAULT tidak dapat dibuat pada kolom dengan tipe data tanda waktu atau kolom dengan properti IDENTITY.

  • Definisi DEFAULT tidak dapat dibuat untuk kolom dengan jenis data alias jika jenis data alias terikat ke objek default.

BATASAN CHECK

  • Kolom dapat memiliki sejumlah batasan CHECK, dan kondisinya dapat menyertakan beberapa ekspresi logis yang dikombinasikan dengan AND dan OR. Beberapa batasan CHECK untuk kolom divalidasi dalam urutan pembuatannya.

  • Kondisi pencarian harus dievaluasi ke ekspresi Boolean dan tidak dapat mereferensikan tabel lain.

  • Batasan CHECK tingkat kolom hanya dapat mereferensikan kolom yang dibatasi, dan batasan CHECK tingkat tabel hanya dapat mereferensikan kolom dalam tabel yang sama.

    CHECK CONSTRAINTS dan aturan melayani fungsi yang sama untuk memvalidasi data selama pernyataan INSERT dan UPDATE.

  • Saat aturan dan satu atau beberapa batasan CHECK ada untuk kolom atau kolom, semua batasan dievaluasi.

  • Batasan CHECK tidak dapat ditentukan pada kolom teks, ntext, atau gambar .

Informasi Batasan Tambahan

  • Indeks yang dibuat untuk batasan tidak dapat dihilangkan dengan menggunakan DROP INDEX; batasan harus dihilangkan dengan menggunakan ALTER TABLE. Indeks yang dibuat untuk dan digunakan oleh batasan dapat dibangun kembali dengan menggunakan ALTER INDEX ... REBUILD. Untuk informasi selengkapnya, lihat Mengatur Ulang dan Membangun Ulang Indeks.
  • Nama batasan harus mengikuti aturan untuk pengidentifikasi, kecuali bahwa nama tidak dapat dimulai dengan tanda angka (#). Jika constraint_name tidak disediakan, nama yang dihasilkan sistem ditetapkan ke batasan. Nama batasan muncul dalam pesan kesalahan apa pun tentang pelanggaran batasan.
  • Ketika batasan dilanggar dalam INSERTpernyataan , , UPDATEatau DELETE , pernyataan diakhiri. Namun, ketika SET XACT_ABORT diatur ke OFF, transaksi, jika pernyataan adalah bagian dari transaksi eksplisit, terus diproses. Ketika SET XACT_ABORT diatur ke AKTIF, seluruh transaksi digulung balik. Anda juga dapat menggunakan ROLLBACK TRANSACTION pernyataan dengan definisi transaksi dengan memeriksa @@ERROR fungsi sistem.
  • Saat ALLOW_ROW_LOCKS = ON dan ALLOW_PAGE_LOCK = ON, kunci tingkat baris, halaman, dan tabel diizinkan saat Anda mengakses indeks. Mesin Database memilih kunci yang sesuai dan dapat meningkatkan kunci dari baris atau kunci halaman ke kunci tabel. Ketika ALLOW_ROW_LOCKS = OFF dan ALLOW_PAGE_LOCK = OFF, hanya kunci tingkat tabel yang diizinkan saat Anda mengakses indeks.
  • Jika tabel memiliki FOREIGN KEY atau CHECK CONSTRAINTS dan pemicu, kondisi batasan dievaluasi sebelum pemicu dijalankan.

Untuk laporan tentang tabel dan kolomnya, gunakan sp_help atau sp_helpconstraint. Untuk mengganti nama tabel, gunakan sp_rename. Untuk laporan tentang tampilan dan prosedur tersimpan yang bergantung pada tabel, gunakan sys.dm_sql_referenced_entities dan sys.dm_sql_referencing_entities.

Aturan nullability dalam definisi tabel

Kemampuan null kolom menentukan apakah kolom tersebut dapat mengizinkan nilai null (NULL) sebagai data di kolom tersebut. NULL bukan nol atau kosong: NULL berarti tidak ada entri yang dibuat atau eksplisit NULL disediakan, dan biasanya menyiratkan bahwa nilainya tidak diketahui atau tidak berlaku.

Saat Anda menggunakan CREATE TABLE atau ALTER TABLE untuk membuat atau mengubah pengaruh pengaturan tabel, database, dan sesi dan mungkin menggantikan nullability tipe data yang digunakan dalam definisi kolom. Kami menyarankan agar Anda selalu secara eksplisit menentukan kolom sebagai NULL atau NOT NULL untuk kolom yang tidak dikomputasi atau, jika Anda menggunakan jenis data yang ditentukan pengguna, sehingga Anda mengizinkan kolom menggunakan nullabilitas default dari jenis data. Kolom jarang harus selalu memperbolehkan NULL.

Ketika nullability kolom tidak ditentukan secara eksplisit, nullability kolom mengikuti aturan yang diperlihatkan dalam tabel berikut.

Jenis data kolom Aturan
Jenis data alias Mesin Database menggunakan nullability yang ditentukan saat jenis data dibuat. Untuk menentukan nullabilitas default dari jenis data, gunakan sp_help.
Jenis yang ditentukan pengguna CLR Nullability ditentukan sesuai dengan definisi kolom.
Jenis data yang disediakan sistem Jika jenis data yang disediakan sistem hanya memiliki satu opsi, itu lebih diutamakan. jenis data tanda waktu tidak boleh NULL. Saat pengaturan sesi diatur AKTIF dengan menggunakan SET:
ANSI_NULL_DFLT_ON = AKTIF, NULL ditetapkan.
ANSI_NULL_DFLT_OFF = AKTIF, NOT NULL ditetapkan.

Saat pengaturan database apa pun dikonfigurasi dengan menggunakan ALTER DATABASE:
ANSI_NULL_DEFAULT_ON = AKTIF, NULL ditetapkan.
ANSI_NULL_DEFAULT_OFF = AKTIF, NOT NULL ditetapkan.

Untuk menampilkan pengaturan database untuk ANSI_NULL_DEFAULT, gunakan sys.databases tampilan katalog

Ketika tidak ada opsi ANSI_NULL_DFLT yang diatur untuk sesi dan database diatur ke default (ANSI_NULL_DEFAULT NONAKTIF), default NOT NULL ditetapkan.

Jika kolom adalah kolom komputasi, nullability-nya selalu ditentukan secara otomatis oleh Mesin Database. Untuk mengetahui ketiadaan jenis kolom ini, gunakan COLUMNPROPERTY fungsi dengan properti AllowsNull .

Catatan

Driver SQL Server ODBC dan driver SQL Server OLE DB keduanya default memiliki ANSI_NULL_DFLT_ON diatur ke AKTIF. Pengguna ODBC dan OLE DB dapat mengonfigurasi ini di sumber data ODBC, atau dengan atribut koneksi atau properti yang diatur oleh aplikasi.

Kompresi Data

Tabel sistem tidak dapat diaktifkan untuk pemadatan. Saat Anda membuat tabel, kompresi data diatur ke NONE, kecuali ditentukan sebaliknya. Jika Anda menentukan daftar partisi atau partisi yang berada di luar rentang, kesalahan akan dihasilkan. Untuk informasi selengkapnya tentang pemadatan data, lihat Pemadatan Data.

Untuk mengevaluasi bagaimana mengubah status kompresi akan memengaruhi tabel, indeks, atau partisi, gunakan prosedur tersimpan sp_estimate_data_compression_savings .

Izin

CREATE TABLE Memerlukan izin dalam database dan ALTER izin pada skema tempat tabel sedang dibuat.

Jika ada kolom dalam CREATE TABLE pernyataan yang didefinisikan sebagai jenis yang ditentukan pengguna, REFERENCES izin pada jenis yang ditentukan pengguna diperlukan.

Jika ada kolom dalam CREATE TABLE pernyataan yang didefinisikan sebagai jenis yang ditentukan pengguna CLR, kepemilikan jenis atau REFERENCES izin di dalamnya diperlukan.

Jika ada kolom dalam CREATE TABLE pernyataan yang memiliki koleksi skema XML yang terkait dengannya, kepemilikan koleksi skema XML atau REFERENCES izin di dalamnya diperlukan.

Setiap pengguna dapat membuat tabel sementara di tempdb.

Jika pernyataan membuat tabel ledger, ENABLE LEDGER izin diperlukan.

Contoh

A. Membuat batasan KUNCI PRIMER pada kolom

Contoh berikut menunjukkan definisi kolom untuk batasan KUNCI PRIMER dengan indeks berkluster pada EmployeeID kolom Employee tabel. Karena nama batasan tidak ditentukan, sistem menyediakan nama batasan.

CREATE TABLE dbo.Employee (
    EmployeeID INT PRIMARY KEY CLUSTERED
);

B. Menggunakan batasan KUNCI ASING

Batasan KUNCI ASING digunakan untuk mereferensikan tabel lain. Kunci asing dapat berupa kunci kolom tunggal atau kunci multikolom. Contoh berikut ini memperlihatkan batasan FOREIGN KEY kolom tunggal pada SalesOrderHeader tabel yang mereferensikan SalesPerson tabel. Hanya klausa REFERENCES yang diperlukan untuk batasan KUNCI ASING kolom tunggal.

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

Anda juga dapat secara eksplisit menggunakan klausul FOREIGN KEY dan memulihkan atribut kolom. Perhatikan bahwa nama kolom tidak harus sama di kedua tabel.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Batasan kunci multikolom dibuat sebagai batasan tabel. Dalam database AdventureWorks2012 , SpecialOfferProduct tabel menyertakan KUNCI PRIMER multikolom. Contoh berikut menunjukkan cara mereferensikan kunci ini dari tabel lain; nama batasan eksplisit bersifat opsional.

CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
    FOREIGN KEY (ProductID, SpecialOfferID)
    REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)

C. Menggunakan batasan UNIK

Batasan UNIK digunakan untuk memberlakukan keunikan pada kolom kunci nonprimary. Contoh berikut memberlakukan pembatasan bahwa Name kolom Product tabel harus unik.

Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED

D. Menggunakan definisi DEFAULT

Default menyediakan nilai (dengan pernyataan INSERT dan UPDATE) ketika tidak ada nilai yang disediakan. Misalnya, database AdventureWorks2012 dapat menyertakan tabel pencarian yang mencantumkan berbagai pekerjaan yang dapat diisi karyawan di perusahaan. Di bawah kolom yang menjelaskan setiap pekerjaan, string karakter default dapat memberikan deskripsi saat deskripsi aktual tidak dimasukkan secara eksplisit.

DEFAULT 'New Position - title not formalized yet'

Selain konstanta, definisi DEFAULT dapat menyertakan fungsi. Gunakan contoh berikut untuk mendapatkan tanggal saat ini untuk entri.

DEFAULT (GETDATE())

Pemindaian fungsi niladik juga dapat meningkatkan integritas data. Untuk melacak pengguna yang menyisipkan baris, gunakan fungsi niladik untuk USER. Jangan sertakan fungsi niladik dengan tanda kurung.

DEFAULT USER

E. Menggunakan batasan CHECK

Contoh berikut menunjukkan pembatasan yang dibuat untuk nilai yang dimasukkan ke CreditRating dalam kolom Vendor tabel. Batasan tidak disebutkan namanya.

CHECK (CreditRating >= 1 and CreditRating <= 5)

Contoh ini memperlihatkan batasan bernama dengan pembatasan pola pada data karakter yang dimasukkan ke dalam kolom tabel.

CONSTRAINT CK_emp_id CHECK (
    emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
    OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
)

Contoh ini menentukan bahwa nilai harus berada dalam daftar tertentu atau mengikuti pola yang ditentukan.

CHECK (
    emp_id IN ('1389', '0736', '0877', '1622', '1756')
    OR emp_id LIKE '99[0-9][0-9]'
)

F. Memperlihatkan definisi tabel lengkap

Contoh berikut menunjukkan definisi tabel lengkap dengan semua definisi batasan untuk tabel PurchaseOrderDetail yang dibuat dalam database AdventureWorks2012 . Perhatikan bahwa untuk menjalankan sampel, skema tabel diubah menjadi dbo.

CREATE TABLE dbo.PurchaseOrderDetail
(
    PurchaseOrderID int NOT NULL
        REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
    LineNumber smallint NOT NULL,
    ProductID int NULL
        REFERENCES Production.Product(ProductID),
    UnitPrice money NULL,
    OrderQty smallint NULL,
    ReceivedQty float NULL,
    RejectedQty float NULL,
    DueDate datetime NULL,
    rowguid uniqueidentifier ROWGUIDCOL NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()),
    ModifiedDate datetime NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()),
    LineTotal AS ((UnitPrice*OrderQty)),
    StockedQty AS ((ReceivedQty-RejectedQty)),
    CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber
               PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
               WITH (IGNORE_DUP_KEY = OFF)
)
ON PRIMARY;

G. Membuat tabel dengan kolom xml yang diketik ke koleksi skema XML

Contoh berikut membuat tabel dengan xml kolom yang diketik ke koleksi HRResumeSchemaCollectionskema XML . Kata DOCUMENT kunci menentukan bahwa setiap instans jenis xml data di column_name hanya dapat berisi satu elemen tingkat atas.

CREATE TABLE HumanResources.EmployeeResumes
(
    LName nvarchar(25),
    FName nvarchar(25),
    Resume xml(DOCUMENT HumanResources.HRResumeSchemaCollection)
);

H. Membuat tabel yang dipartisi

Contoh berikut membuat fungsi partisi untuk mempartisi tabel atau indeks menjadi empat partisi. Kemudian, contoh membuat skema partisi yang menentukan grup file untuk menahan masing-masing dari empat partisi. Terakhir, contoh membuat tabel yang menggunakan skema partisi. Contoh ini mengasumsikan grup file sudah ada dalam database.

CREATE PARTITION FUNCTION myRangePF1 (int)
    AS RANGE LEFT FOR VALUES (1, 100, 1000);
GO

CREATE PARTITION SCHEME myRangePS1
    AS PARTITION myRangePF1
    TO (test1fg, test2fg, test3fg, test4fg);
GO  
  
CREATE TABLE PartitionTable (col1 int, col2 char(10))
    ON myRangePS1 (col1);
GO

Berdasarkan nilai kolom col1PartitionTable, partisi ditetapkan dengan cara berikut.

Grup file test1fg test2fg test3fg test4fg
Partisi 1 2 3 4
Nilai col 1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <= 1.000 col1 > 1000

i. Menggunakan tipe data pengidentifikasi unik dalam kolom

Contoh berikut membuat tabel dengan uniqueidentifier kolom. Contoh menggunakan batasan KUNCI PRIMER untuk melindungi tabel terhadap pengguna yang menyisipkan nilai duplikat, dan menggunakan NEWSEQUENTIALID() fungsi dalam DEFAULT batasan untuk memberikan nilai untuk baris baru. Properti ROWGUIDCOL diterapkan ke uniqueidentifier kolom sehingga dapat dirujuk menggunakan kata kunci $ROWGUID.

CREATE TABLE dbo.Globally_Unique_Data
(
    GUID UNIQUEIDENTIFIER
        CONSTRAINT Guid_Default DEFAULT
        NEWSEQUENTIALID() ROWGUIDCOL,
    Employee_Name VARCHAR(60)
    CONSTRAINT Guid_PK PRIMARY KEY (GUID)
);

j. Menggunakan ekspresi untuk kolom komputasi

Contoh berikut menunjukkan penggunaan ekspresi ((low + high)/2) untuk menghitung myavg kolom komputasi.

CREATE TABLE dbo.mytable
(
    low INT,
    high INT,
    myavg AS (low + high)/2
);

K. Membuat kolom komputasi berdasarkan kolom jenis yang ditentukan pengguna

Contoh berikut membuat tabel dengan satu kolom yang didefinisikan sebagai jenis utf8stringyang ditentukan pengguna, dengan asumsi bahwa rakitan jenis, dan jenis itu sendiri, telah dibuat dalam database saat ini. Kolom kedua ditentukan berdasarkan utf8string, dan menggunakan metode ToString()jenis (kelas)utf8string untuk menghitung nilai untuk kolom.

CREATE TABLE UDTypeTable
(
    u UTF8STRING,
    ustr AS u.ToString() PERSISTED
);

L. Menggunakan fungsi USER_NAME untuk kolom komputasi

Contoh berikut menggunakan USER_NAME() fungsi di myuser_name kolom .

CREATE TABLE dbo.mylogintable
(
    date_in DATETIME,
    user_id INT,
    myuser_name AS USER_NAME()
);

M. Membuat tabel yang memiliki kolom FILESTREAM

Contoh berikut membuat tabel yang memiliki FILESTREAM kolom Photo. Jika tabel memiliki satu atau beberapa FILESTREAM kolom, tabel harus memiliki satu ROWGUIDCOL kolom.

CREATE TABLE dbo.EmployeePhoto
(
    EmployeeId INT NOT NULL PRIMARY KEY,
    Photo VARBINARY(MAX) FILESTREAM NULL,
    MyRowGuidColumn UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID()
);

N. Membuat tabel yang menggunakan pemadatan baris

Contoh berikut membuat tabel yang menggunakan pemadatan baris.

CREATE TABLE dbo.T1
(
    c1 INT,
    c2 NVARCHAR(200)
)
WITH (DATA_COMPRESSION = ROW);

Untuk contoh kompresi data tambahan, lihat Kompresi Data.

O. Membuat tabel yang menggunakan pemadatan XML

Berlaku untuk: pratinjau SQL Server 2022 (16.x) dan yang lebih baru, dan Pratinjau Database Azure SQL.

Contoh berikut membuat tabel yang menggunakan pemadatan baris.

CREATE TABLE dbo.T1
(
    c1 INT,
    c2 XML
)
WITH (XML_COMPRESSION = ON);

P. Membuat tabel yang memiliki kolom jarang dan kumpulan kolom

Contoh berikut menunjukkan cara membuat tabel yang memiliki kolom jarang, dan tabel yang memiliki dua kolom jarang dan kumpulan kolom. Contohnya menggunakan sintaks dasar. Untuk contoh yang lebih kompleks, lihat Menggunakan Kolom Jarang dan Menggunakan Kumpulan Kolom.

Contoh ini membuat tabel yang memiliki kolom jarang.

CREATE TABLE dbo.T1
(
    c1 INT PRIMARY KEY,
    c2 VARCHAR(50) SPARSE NULL
);

Contoh ini membuat tabel yang memiliki dua kolom jarang dan kumpulan kolom bernama CSet.

CREATE TABLE T1
(
    c1 INT PRIMARY KEY,
    c2 VARCHAR(50) SPARSE NULL,
    c3 INT SPARSE NULL,
    CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
);

T. Membuat tabel temporal berbasis disk berbasis sistem

Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Database Azure SQL.

Contoh berikut menunjukkan cara membuat tabel temporal yang ditautkan ke tabel riwayat baru, dan cara membuat tabel temporal yang ditautkan ke tabel riwayat yang sudah ada. Perhatikan bahwa tabel temporal harus memiliki kunci primer yang ditentukan untuk diaktifkan agar tabel diaktifkan untuk penerapan versi sistem. Untuk contoh yang menunjukkan cara menambahkan atau menghapus penerapan versi sistem pada tabel yang sudah ada, lihat Penerapan Versi Sistem di Contoh. Untuk kasus penggunaan, lihat Tabel Temporal.

Contoh ini membuat tabel temporal baru yang ditautkan ke tabel riwayat baru.

CREATE TABLE Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);

Contoh ini membuat tabel temporal baru yang ditautkan ke tabel riwayat yang sudah ada.

-- Existing table
CREATE TABLE Department_History
(
    DepartmentNumber CHAR(10) NOT NULL,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 NOT NULL,
    ValidTo DATETIME2 NOT NULL
);

-- Temporal table
CREATE TABLE Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Department_History, DATA_CONSISTENCY_CHECK = ON));

R. Membuat tabel temporal yang dioptimalkan memori versi sistem

Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Database Azure SQL.

Contoh berikut menunjukkan cara membuat tabel temporal yang dioptimalkan memori versi sistem yang ditautkan ke tabel riwayat berbasis disk baru.

Contoh ini membuat tabel temporal baru yang ditautkan ke tabel riwayat baru.

CREATE SCHEMA History;
GO

CREATE TABLE dbo.Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY NONCLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH
(
    MEMORY_OPTIMIZED = ON,
    DURABILITY = SCHEMA_AND_DATA,
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.DepartmentHistory)
);

Contoh ini membuat tabel temporal baru yang ditautkan ke tabel riwayat yang sudah ada.

-- Existing table
CREATE TABLE Department_History
(
    DepartmentNumber CHAR(10) NOT NULL,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 NOT NULL,
    ValidTo DATETIME2 NOT NULL
);

-- Temporal table
CREATE TABLE Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH
(
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Department_History, DATA_CONSISTENCY_CHECK = ON)
);

S. Membuat tabel dengan kolom terenkripsi

Contoh berikut membuat tabel dengan dua kolom terenkripsi. Untuk informasi selengkapnya, lihat Always Encrypted.

CREATE TABLE Customers (
    CustName NVARCHAR(60)
        ENCRYPTED WITH (
            COLUMN_ENCRYPTION_KEY = MyCEK,
            ENCRYPTION_TYPE = RANDOMIZED,
            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ),
    SSN VARCHAR(11) COLLATE Latin1_General_BIN2
        ENCRYPTED WITH (
            COLUMN_ENCRYPTION_KEY = MyCEK,
            ENCRYPTION_TYPE = DETERMINISTIC ,
            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ),
    Age INT NULL
);

T. Membuat indeks yang difilter sebaris

Membuat tabel dengan indeks yang difilter sebaris.

CREATE TABLE t1
(
    c1 INT,
    index IX1 (c1) WHERE c1 > 0
);

U. Membuat indeks sebaris

Berikut ini menunjukkan cara menggunakan NONCLUSTERED sebaris untuk tabel berbasis disk:

CREATE TABLE t1
(
    c1 INT,
    INDEX ix_1 NONCLUSTERED (c1)
);

CREATE TABLE t2
(
    c1 INT,
    c2 INT INDEX ix_1 NONCLUSTERED
);

CREATE TABLE t3
(
    c1 INT,
    c2 INT,
    INDEX ix_1 NONCLUSTERED (c1,c2)
);

V. Membuat tabel sementara dengan kunci primer senyawa bernama anonim

Membuat tabel dengan kunci primer senyawa bernama anonim. Ini berguna untuk menghindari konflik run-time di mana dua tabel sementara yang dilingkup sesi, masing-masing dalam sesi terpisah, menggunakan nama yang sama untuk batasan.

CREATE TABLE #tmp
(
    c1 INT,
    c2 INT,
    PRIMARY KEY CLUSTERED ([c1], [c2])
);
GO

Jika Anda secara eksplisit memberi nama batasan, sesi kedua akan menghasilkan kesalahan seperti:

Msg 2714, Level 16, State 5, Line 1
There is already an object named 'PK_#tmp' in the database.
Msg 1750, Level 16, State 1, Line 1
Could not create constraint or index. See previous errors.

Masalah muncul dari fakta bahwa meskipun nama tabel sementara unik, nama batasannya tidak.

W. Menggunakan tabel sementara global di Azure SQL Database

Sesi A membuat tabel sementara global ##test di Azure SQL Database testdb1 dan menambahkan 1 baris

CREATE TABLE ##test (
    a INT,
    b INT
);

INSERT INTO ##test
VALUES (1, 1);

-- Obtain object ID for temp table ##test
SELECT OBJECT_ID('tempdb.dbo.##test') AS 'Object ID';

Berikut adalah hasil yang ditetapkan.

1253579504

Mendapatkan nama tabel sementara global untuk ID objek tertentu 1253579504 dalam tempdb (2)

SELECT name FROM tempdb.sys.objects WHERE object_id = 1253579504;

Berikut adalah hasil yang ditetapkan.

##test

Sesi B tersambung ke Azure SQL Database testdb1 dan dapat mengakses tabel ##test yang dibuat oleh sesi A

SELECT * FROM ##test;

Berikut adalah hasil yang ditetapkan.

1, 1

Sesi C tersambung ke database lain di Azure SQL Database testdb2 dan ingin mengakses ##test dibuat di testdb1. Pemilihan ini gagal karena cakupan database untuk tabel sementara global

SELECT * FROM ##test

Yang menghasilkan kesalahan berikut:

Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

Menangani objek sistem di Azure SQL Database tempdb dari testdb1 database pengguna saat ini

SELECT * FROM tempdb.sys.objects;
SELECT * FROM tempdb.sys.columns;
SELECT * FROM tempdb.sys.database_files;

X. Mengaktifkan Kebijakan Penyimpanan Data pada tabel

Contoh berikut membuat tabel dengan retensi data diaktifkan dan periode retensi 1 minggu. Contoh ini hanya berlaku untuk Azure SQL Edge.

CREATE TABLE [dbo].[data_retention_table] 
(
  [dbdatetime2] datetime2(7), 
  [product_code] int, 
  [value] char(10)
) 
WITH (DATA_DELETION = ON ( FILTER_COLUMN = [dbdatetime2], RETENTION_PERIOD = 1 WEEKS ))

Y. Membuat tabel ledger yang dapat diperbarui

Contoh berikut membuat tabel ledger yang dapat diperbarui yang bukan tabel temporal dengan tabel riwayat anonim (sistem akan menghasilkan nama tabel riwayat) dan nama tampilan ledger yang dihasilkan. Karena nama kolom selalu yang dihasilkan yang diperlukan dan kolom tambahan dalam tampilan ledger tidak ditentukan, kolom akan memiliki nama default.

CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL,
    Salary Money NOT NULL
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO

Contoh berikut membuat tabel yang merupakan tabel temporal dan tabel ledger yang dapat diperbarui, dengan tabel riwayat anonim (dengan nama yang dihasilkan oleh sistem), nama tampilan ledger yang dihasilkan dan nama default kolom always yang dihasilkan dan kolom tampilan ledger tambahan.

CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL PRIMARY KEY,
    Salary Money NOT NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO

Contoh berikut membuat tabel yang merupakan tabel temporal dan tabel ledger yang dapat diperbarui dengan tabel riwayat bernama secara eksplisit, nama tampilan ledger yang ditentukan pengguna, dan nama yang ditentukan pengguna dari kolom always yang dihasilkan dan kolom tambahan dalam tampilan ledger.

CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL PRIMARY KEY,
    Salary Money NOT NULL,
    StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
    EndTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL,
    StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL,
    EndSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = [HR].[EmployeesHistory]),
    LEDGER = ON ( 
        LEDGER_VIEW = [HR].[EmployeesLedger] ( 
            TRANSACTION_ID_COLUMN_NAME = TransactionId,
            SEQUENCE_NUMBER_COLUMN_NAME = SequenceNumber,
            OPERATION_TYPE_COLUMN_NAME = OperationId, 
            OPERATION_TYPE_DESC_COLUMN_NAME = OperationTypeDescription
        )
    )
);
GO

Contoh berikut membuat tabel ledger khusus tambahan dengan nama tampilan ledger yang dihasilkan dan kolom dalam tampilan ledger.

CREATE SCHEMA [AccessControl];
GO
CREATE TABLE [AccessControl].[KeyCardEvents]
(
    EmployeeID INT NOT NULL,
    AccessOperationDescription NVARCHAR (MAX) NOT NULL,
    [Timestamp] Datetime2 NOT NULL,
    StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
    StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
)
WITH (
    LEDGER = ON (
        LEDGER_VIEW = [AccessControl].[KeyCardEventsLedger] (
            TRANSACTION_ID_COLUMN_NAME = TransactionId,
            SEQUENCE_NUMBER_COLUMN_NAME = SequenceNumber,
            OPERATION_TYPE_COLUMN_NAME = OperationId, 
            OPERATION_TYPE_DESC_COLUMN_NAME = OperationTypeDescription
        ),
        APPEND_ONLY = ON
    )
);
GO

Contoh berikut membuat database ledger di Azure SQL Database dan tabel ledger yang dapat diperbarui menggunakan pengaturan default. Membuat tabel ledger yang dapat diperbarui dalam database ledger tidak memerlukan penggunaan WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);.

CREATE DATABASE MyLedgerDB ( EDITION = 'GeneralPurpose' ) WITH LEDGER = ON;
GO

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL,
    Salary Money NOT NULL
)
GO

Langkah berikutnya