BUAT TABEL (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Membuat tabel baru di SQL Server dan Azure SQL Database.

Catatan

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

Konvensi sintaks transact-SQL

Opsi sintaks

Sintaks umum

SintaksIS CREATE TABLE sederhana (umum jika tidak menggunakan opsi):

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition> } [ ,... n ] )
[ ; ]

Sintaks penuh

SintaksIS CREATE TABLE berbasis disk:

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 ] ]
    [ [ CONSTRAINT constraint_name ] {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 ]
        [ ( <column_name> [ ,... n ] ) ]
        [
            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_name [ ASC | DESC ] [ ,... n ] )
        [
            WITH FILLFACTOR = fillfactor
           | WITH ( <index_option> [ ,... n ] )
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ]
    | FOREIGN KEY
        ( column_name [ ,... 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 [ ORDER (column_name [ , ...n ] ) ]
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )
    }
    [ INCLUDE ( 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

SintaksIS CREATE TABLE yang dioptimalkan memori:

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 )
      }
  [ ( <column_name> [ ,... n ] ) ]
  | [ FOREIGN KEY ]
        REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
  | CHECK ( logical_expression )
}

<table_constraint> ::=
 [ CONSTRAINT constraint_name ]
{
   { PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED ( column_name [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
                    }
    | FOREIGN KEY
        ( column_name [ ,... 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_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
  | [ NONCLUSTERED ] ( column_name [ 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 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

database_name

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.

schema_name

Nama skema tempat tabel baru berada.

table_name

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

AS FileTable

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru.

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

computed_column_expression COLUMN_NAME AS

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: cost AS price * qty. Ekspresi dapat berupa nama kolom yang tidak terkomputasi, konstanta, fungsi, variabel, dan kombinasi apa pun yang terhubung 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 KUNCI ASING atau CHECK.

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

    Misalnya, jika tabel memiliki kolom bilangan a bulat dan b, kolom a + b komputasi dapat diindeks, tetapi kolom a + DATEPART(dd, GETDATE()) komputasi 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 dapat 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, nullability kolom komputasi ditentukan secara otomatis oleh Mesin Database. Hasil dari sebagian besar ekspresi dianggap nullable meskipun hanya kolom yang tidak dapat diubah yang ada, karena kemungkinan aliran bawah 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 tabel yang dipartisi harus ditandai PERSISTEDsecara eksplisit . computed_column_expression harus deterministik ketika PERSISTED ditentukan.

AKTIF { partition_scheme | grup file | "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.

AKTIF { 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. Jika BATASAN KUNCI PRIMER atau UNIK 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, default 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 ALTER TABLE.

TEXTIMAGE_ON { filegroup | "default" }

Menunjukkan bahwa teks, ntext, gambar, xml, varchar(maks), nvarchar(max), varbinary(max), dan kolom jenis yang ditentukan pengguna CLR (termasuk geometri dan geografi) disimpan pada grup file yang ditentukan.

TEXTIMAGE_ON tidak diperbolehkan 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 apa pun yang ditentukan di CREATE TABLE tidak dapat diubah berikutnya.

Catatan

varchar(max), nvarchar(max), varbinary(max), xml, dan nilai UDT besar disimpan langsung di baris data, hingga batas 8.000 byte, dan selama nilai 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 jenis nilai besar di luar opsi sp_tableoption baris untuk menyimpan seluruh nilai LOB dari baris.

Dalam konteks ini, default 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 2008 R2 (10.50.x) dan yang lebih baru. 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 klausul tidak ditentukan, grup file FILESTREAM yang memiliki DEFAULT kumpulan properti digunakan. Jika tidak ada grup file FILESTREAM, kesalahan akan muncul.

Seperti 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 FILESTREAM, skema partisi, atau NULL yang berbeda dapat ditentukan.
  • Pernyataan DROP INDEX mengonversi indeks berkluster menjadi timbunan. 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 didefinisikan dengan menggunakan pernyataan CREATE DATABASE atau ALTER DATABASE ; jika tidak, kesalahan dimunculkan.

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

[ type_schema_name . ] type_name

Menentukan tipe data kolom, dan skema tempat kolom tersebut berada. Untuk tabel berbasis disk, gunakan salah satu jenis data berikut:

  • 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 Database Engine mereferensikan type_name dalam urutan berikut:

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

Untuk tabel yang dioptimalkan memori, lihat Jenis Data yang Didukung untuk OLTP Dalam Memori untuk daftar jenis sistem yang didukung.

  • Presisi

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

  • Skala

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

  • max

    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.

DOKUMEN

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 jenis 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 saat 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

    Fungsi konstanta, NULL, atau sistem yang digunakan sebagai nilai default untuk kolom.

  • memory_optimized_constant_expression

    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.

IDENTITY

Menunjukkan bahwa kolom baru adalah kolom identitas. Saat baris baru ditambahkan ke tabel, Mesin Database menyediakan nilai bertahap yang unik untuk kolom tersebut. Kolom identitas biasanya digunakan dengan batasan KUNCI PRIMER 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. Batasan default dan DEFAULT terikat tidak dapat digunakan dengan kolom identitas. Benih dan kenaikan atau tidak sama sekali tidak harus ditentukan. Jika tidak ditentukan, defaultnya adalah (1,1).

  • Benih

    Nilai yang digunakan untuk baris pertama yang dimuat ke dalam tabel.

  • Kenaikan

    Nilai inkremental ditambahkan ke nilai identitas 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 klausa ini ditentukan untuk batasan, batasan tidak diberlakukan saat agen replikasi melakukan operasi sisipkan, perbarui, atau hapus.

DIHASILKAN SELALU SEBAGAI { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { MULAI | END } [ HIDDEN ] [ NOT NULL ]

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance.

Menentukan kolom yang digunakan oleh sistem untuk merekam informasi tentang versi baris secara otomatis dalam tabel dan tabel riwayatnya (jika tabel diberi versi 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 dan tabel temporal yang dapat diperbarui.

Parameter Jenis data yang diperlukan Nullability yang diperlukan Deskripsi
BARIS tanggalwaktu2 MULAI: NOT NULL
AKHIR: NOT NULL
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
AKHIR: NULL
Berlaku untuk: SQL Server 2022 (16.x) dan yang lebih baru, dan Azure SQL Database.

ID transaksi yang membuat (START) atau membatalkan (END) versi baris. Jika tabel adalah tabel ledger, ID mereferensikan baris dalam tampilan sys.database_ledger_transactions
SEQUENCE_NUMBER bigint MULAI: NOT NULL
AKHIR: NULL
Berlaku untuk: SQL Server 2022 (16.x) dan yang lebih baru, dan Azure SQL Database.

Jumlah urutan operasi yang membuat (START) atau menghapus (END) versi baris. Nilai ini unik dalam transaksi.

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 titik dengan HIDDEN bendera 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 HIDDEN atribut 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 2014 (12.x) dan yang lebih baru, dan Azure SQL Database.

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 menurun.

INDEX index_name CLUSTERED COLUMNSTORE

Berlaku untuk: SQL Server 2014 (12.x) dan yang lebih baru, dan Azure SQL Database.

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.

Di Azure Synapse Analytics, Analytics Platform System (PDW), dan SQL Server 2022 (16.x) dan versi yang lebih baru, Anda dapat menentukan urutan kolom untuk indeks penyimpan kolom berkluster. Untuk informasi selengkapnya, lihat Menggunakan indeks penyimpan kolom berkluster yang diurutkan untuk tabel gudang data besar.

INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )

Berlaku untuk: SQL Server 2014 (12.x) dan yang lebih baru, dan Azure SQL Database.

Menentukan untuk membuat indeks penyimpan kolom non-kluster pada tabel. Tabel yang mendasar dapat berupa tumpuan rowstore atau indeks berkluster, atau dapat menjadi indeks penyimpan kolom berkluster. Dalam semua kasus, membuat indeks penyimpan kolom nonclustered 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 tipe 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 UNIK, 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 tidak berkluster, 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 mempartisi indeks, Tabel dan Indeks Yang Dipartisi.

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.

AKTIF "default"

Membuat indeks yang ditentukan pada grup file default.

Catatan

Dalam konteks ini, default 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.

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

Berlaku untuk: SQL Server 2008 R2 (10.50.x) 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 klausa.

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 jenis data yang ditentukan pengguna tidak dapat ditunjuk 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 gabungan tabel menggunakan gabungan kesetaraan berdasarkan nilai terenkripsi, tetapi juga dapat memungkinkan pengguna yang tidak sah 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. 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 dari jenis data yang memenuhi syarat.

  • ALGORITMA

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

    Harus berupa '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.

MASKED WITH ( FUNCTION = 'mask_function' )

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

Menentukan masker data dinamis. mask_function adalah nama fungsi masking dengan parameter yang sesuai. Empat fungsi tersedia:

  • default()
  • email()
  • partial()
  • random()

Memerlukan ALTER ANY MASK izin.

Untuk parameter fungsi, lihat Masking Data Dinamis.

FILESTREAM

Berlaku untuk: SQL Server 2008 R2 (10.50.x) dan yang lebih baru.

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

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 kolas untuk kolom. Nama kolase dapat berupa nama kolase Windows atau nama kolase SQL. collation_name hanya berlaku untuk kolom tipe data karakter, varchar, teks, nchar, nvarchar, dan ntext. Jika tidak ditentukan, kolom ditetapkan baik kolase jenis data yang ditentukan pengguna, jika kolom adalah jenis data yang ditentukan pengguna, atau kolase default database.

Untuk informasi selengkapnya tentang nama kolase Windows dan SQL, lihat Nama Kolase Windows dan Nama Kolase SQL.

Untuk informasi selengkapnya, lihat COLLATE.

CONSTRAINT

Kata kunci opsional yang menunjukkan awal definisi KUNCI PRIMER, BUKAN NULL, UNIK, KUNCI ASING, atau BATASAN CHECK.

  • constraint_name

    Nama batasan. Nama batasan harus unik dalam skema tempat tabel berada.

  • NULL | BUKAN NULL

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

  • KUNCI PRIMER

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

  • UNIQUE

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

  • BERKLUSTER | NONCLUSTERED

    Menunjukkan bahwa indeks berkluster atau non-kluster dibuat untuk batasan KUNCI PRIMER atau UNIK. BATASAN KUNCI PRIMER default ke CLUSTERED, dan batasan UNIK default ke NONCLUSTERED.

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

  • REFERENSI KUNCI ASING

    Batasan yang menyediakan integritas referensial untuk data di kolom atau kolom. Batasan KUNCI ASING mengharuskan setiap nilai dalam kolom ada di kolom atau kolom yang dirujuk terkait dalam tabel yang dirujuk. Batasan KUNCI ASING hanya dapat mereferensikan kolom yang merupakan batasan KUNCI PRIMER atau UNIK 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 ]

    Nama tabel yang dirujuk oleh batasan KUNCI ASING, dan skema tempat tabel berada.

  • ( ref_column [ ,... n ] )

    Kolom, atau daftar kolom, dari tabel yang dirujuk oleh batasan KUNCI ASING.

  • ON DELETE { NO ACTION | CASCADE | SET 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 NO ACTION.

  • 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 saat 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 apakah tabel akan disertakan dalam publikasi gabungan yang menggunakan rekaman logis. Untuk informasi selengkapnya tentang rekaman logis, lihat Perubahan Grup pada Baris Terkait dengan Rekaman Logis.

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

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

    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 hapus pada Vendor baris 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 NO ACTION.

  • 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 pada Baris Terkait dengan Rekaman Logis.

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

    Misalnya, dalam AdventureWorks2022 database, ProductVendor tabel memiliki hubungan referensial dengan Vendor tabel: ProductVendor.BusinessEntity kunci asing mereferensikan Vendor.BusinessEntityID kunci utama.

    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 Vendor baris jika setidaknya ada satu baris dalam ProductVendor tabel yang mereferensikannya.

  • CHECK

    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 PERSISTED.

  • logical_expression

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

  • column_name

    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

    Nama skema partisi yang menentukan 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 perlu memeriksa nilai null.

  • WITH 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

    MendokumenKAN DENGAN FILLFACTOR = fillfactor sebagai satu-satunya opsi indeks yang berlaku untuk batasan KUNCI PRIMER atau UNIK dipertahankan untuk kompatibilitas mundur, tetapi tidak akan didokumenkan dengan cara ini dalam rilis mendatang.

column_set_name COLUMN_SET XML UNTUK ALL_SPARSE_COLUMNS

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 2016 (13.x) dan yang lebih baru, dan Azure SQL Database.

Menentukan nama kolom yang akan digunakan sistem untuk merekam periode yang catatannya valid. Gunakan argumen ini 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 2016 (13.x) dan yang lebih baru, dan Azure SQL Database.

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 sisipkan dan perbarui 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, 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:

  • NONE

    Tabel atau partisi yang ditentukan tidak dikompresi.

  • BARIS

    Tabel atau partisi tertentu dikompresi dengan menggunakan pemadatan baris.

  • PAGE

    Tabel atau partisi yang ditentukan 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 nonclustered dan indeks penyimpan kolom berkluster. COLUMNSTORE menentukan untuk memadatkan dengan kompresi penyimpan kolom yang paling berkinerja. Ini adalah pilihan umum.

  • COLUMNSTORE_ARCHIVE

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

    Hanya berlaku untuk indeks penyimpan kolom, termasuk penyimpan kolom nonclustered 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 mampu lebih banyak waktu untuk penyimpanan dan pengambilan.

Untuk informasi selengkapnya, lihat Kompresi Data.

XML_COMPRESSION

Berlaku untuk: SQL Server 2022 (16.x) dan versi yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance.

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

  • AKTIF

    Kolom yang menggunakan jenis 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 klausa tidak disediakan, DATA_COMPRESSION opsi akan berlaku untuk semua partisi tabel yang dipartisi.

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 | NONAKTIF }

Ketika AKTIF, 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 ruang yang cukup 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 penuh Mesin Database harus membuat tingkat daun 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 = { AKTIF | NONAKTIF }

Menentukan respons kesalahan saat operasi sisipkan 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 = { AKTIF | NONAKTIF }

Saat AKTIF, statistik indeks kedaluarsa tidak dikomputasi ulang secara otomatis. Saat NONAKTIF, pembaruan statistik otomatis diaktifkan. Defaultnya adalah NONAKTIF.

ALLOW_ROW_LOCKS = { AKTIF | NONAKTIF }

Saat AKTIF, kunci baris diizinkan saat Anda mengakses indeks. Mesin Database menentukan kapan kunci baris digunakan. Saat NONAKTIF, kunci baris tidak digunakan. Defaultnya adalah ON.

ALLOW_PAGE_LOCKS = { AKTIF | NONAKTIF }

Saat AKTIF, kunci halaman diizinkan saat Anda mengakses indeks. Mesin Database menentukan kapan kunci halaman digunakan. Saat NONAKTIF, kunci halaman tidak digunakan. Defaultnya adalah ON.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { AKTIF | NONAKTIF }

Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru, 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 BUAT INDEKS untuk informasi selengkapnya.

FILETABLE_DIRECTORY = directory_name

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru.

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 2012 (11.x) dan yang lebih baru. Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILETABLE.

Menentukan nama kolase yang akan diterapkan ke Name kolom 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 2012 (11.x) dan yang lebih baru. Azure SQL Database dan Azure SQL Managed Instance tidak mendukung FILETABLE.

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

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru. 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_name

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru. 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 = ON [ ( HISTORY_TABLE = schema_name. history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance.

Mengaktifkan penerapan versi sistem tabel jika tipe data, batasan nullability, dan persyaratan batasan kunci utama 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 PAGE .

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 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 diizinkan.

REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ] ] | NONAKTIF ( MIGRATION_STATE = DIJEDA ) }

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

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

Penting

Stretch Database tidak digunakan lagi di SQL Server 2022 (16.x) dan Azure SQL Database. Fitur ini akan dihapus dalam versi Mesin Database di masa mendatang. 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 2016 (13.x) dan yang lebih baru.

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 = { OUTBOUND | MASUK | DIJEDA }

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance.

  • Tentukan untuk memigrasikan OUTBOUND data dari SQL Server ke Azure SQL Database.

  • Tentukan INBOUND untuk menyalin data jarak jauh untuk tabel dari Azure SQL Database kembali ke SQL Server dan untuk menonaktifkan Stretch untuk tabel. Untuk informasi selengkapnya, lihat Menonaktifkan Stretch Database dan membawa kembali data jarak jauh.

    Operasi ini menimbulkan biaya transfer data, dan tidak dapat dibatalkan.

  • Tentukan PAUSED untuk menjeda atau menunda migrasi data. Untuk informasi selengkapnya, lihat Menjeda dan melanjutkan migrasi data -Stretch Database.

[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | HARI | MINGGU | MINGGU | BULAN | BULAN | TAHUN | TAHUN } ) } ]

Berlaku untuk: Azure SQL Edge saja

Mengaktifkan 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 usang atau tidak. Tipe data berikut diperbolehkan untuk kolom filter.

    • date
    • datetime
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { INFINITE | number {DAY | HARI | MINGGU | MINGGU | BULAN | BULAN | TAHUN | TAHUN }}

    Menentukan kebijakan periode retensi untuk tabel. Periode retensi ditentukan sebagai kombinasi nilai bilangan bulat positif dan unit bagian tanggal.

MEMORY_OPTIMIZED

Berlaku untuk: SQL Server 2014 (12.x) dan yang lebih baru, 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 OLTP Dalam Memori, yang digunakan untuk mengoptimalkan performa pemrosesan transaksi. Untuk mulai menggunakan OLTP Dalam Memori, lihat Mulai Cepat 1: Teknologi OLTP Dalam Memori 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 2014 (12.x) dan yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance.

Nilai SCHEMA_AND_DATA menunjukkan bahwa tabel tahan lama, yang berarti bahwa perubahan dipertahankan pada disk dan bertahan dari mulai ulang atau failover. SCHEMA_AND_DATA adalah nilai default.

Nilai SCHEMA_ONLY menunjukkan bahwa tabel tidak tahan lama. Skema tabel dipertahankan 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 2014 (12.x) dan yang lebih baru, 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 yang Dioptimalkan Memori.

Bucket_count adalah argumen yang diperlukan.

INDEX

Berlaku untuk: SQL Server 2014 (12.x) dan yang lebih baru, 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 yang Dioptimalkan Memori

  • HASH

    Berlaku untuk: SQL Server 2014 (12.x) dan yang lebih baru, 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 (16.x), Azure SQL Database, dan Azure SQL Managed Instance.

Catatan

Jika pernyataan membuat tabel ledger, ENABLE LEDGER izin diperlukan.

Menunjukkan apakah tabel yang sedang dibuat adalah tabel ledger (ON) atau tidak (NONAKTIF). 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 menjadi 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 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:

  • GENERATED ALWAYS AS TRANSACTION_ID START
  • GENERATED ALWAYS AS TRANSACTION_ID END
  • GENERATED ALWAYS AS SEQUENCE_NUMBER START
  • GENERATED ALWAYS AS SEQUENCE_NUMBER END

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

  • GENERATED ALWAYS AS TRANSACTION_ID START
  • GENERATED ALWAYS AS SEQUENCE_NUMBER START

Jika salah satu kolom always 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 menimbulkan kesalahan.

[ledger_start_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL
[ledger_end_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL
[ledger_start_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
[ledger_end_sequence_number] BIGINT GENERATED 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 di 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 pada tabel ledger menghasilkan dua baris baru pada tampilan ledger. Satu baris berisi 2 (DELETE) dan baris lainnya berisi 1 (INSERT) di 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 | NONAKTIF ]

Menentukan apakah tabel ledger yang sedang dibuat hanya ditambahkan atau dapat diperbarui. Default 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 halaman yang cukup untuk mengisi tingkat seragam. Setelah memiliki cukup halaman untuk mengisi tingkat seragam, tingkat 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 batasan DEFAULT, IDENTITY, ROWGUIDCOL, atau kolom ditentukan dalam definisi kolom.

Saat tabel dibuat, opsi PENGIDENTIFIKASI KUTIPan 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 nomor tunggal (#table_name), dan awali nama tabel sementara global dengan tanda nomor 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 secara bersamaan oleh 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 ketika mereka keluar dari cakupan, kecuali secara eksplisit dihilangkan dengan menggunakan DROP TABLE:

  • Tabel sementara lokal yang dibuat dalam prosedur tersimpan dihilangkan secara otomatis ketika 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 lainnya 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, kueri tersebut 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 KUNCI ASING ditentukan dalam tabel sementara, pernyataan mengembalikan pesan peringatan yang menyatakan batasan dilewati. Tabel masih dibuat tanpa batasan KUNCI ASING. 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 utama bernama, prosedur tersimpan tidak 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 dan dibagikan di tempdb antara semua sesi pengguna di seluruh instans SQL Server. Untuk informasi tentang jenis tabel SQL, lihat bagian di atas pada Buat Tabel.

Azure SQL Database mendukung tabel sementara global yang juga disimpan dan dilingkup tempdb ke tingkat database. Ini berarti bahwa tabel sementara global dibagikan untuk semua sesi pengguna dalam Azure SQL Database 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 digunakan SQL Server untuk tabel sementara. Demikian pula, prosedur tersimpan sementara global juga dilingkup 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 dengan yang digunakan SQL Server. Lihat bagian di atas pada Tabel Sementara.

Penting

Fitur ini tersedia untuk Azure SQL Database.

Memecahkan masalah tabel sementara global untuk Azure SQL Database

Untuk pemecahan tempdbmasalah , 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 partisi. 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 KUNCI PRIMER 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 UNIK.

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

    Catatan

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

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

Batasan UNIK

  • Jika CLUSTERED atau NONCLUSTERED tidak ditentukan untuk batasan UNIK, 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 harus mendukung pengurutan biner atau berbasis operator. Untuk informasi selengkapnya, lihat Jenis yang Ditentukan Pengguna 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 KUNCI ASING 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 KUNCI ASING dapat mereferensikan kolom lain dalam tabel yang sama. Ini disebut sebagai referensi mandiri.

  • Klausa REFERENCES dari batasan KUNCI ASING tingkat kolom hanya dapat mencantumkan satu kolom referensi. Kolom ini harus memiliki tipe data yang sama dengan kolom tempat batasan ditentukan.

  • Klausa REFERENCES dari batasan KUNCI ASING tingkat tabel harus memiliki jumlah kolom referensi yang sama dengan jumlah kolom dalam daftar kolom batasan. Tipe data dari setiap kolom referensi juga harus sama dengan kolom terkait dalam daftar kolom. Kolom referensi harus ditentukan dalam urutan yang sama 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, ATUR NULL, dan ATUR DEFAULT. Saat 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 aktual 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 kurang lebih 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 KUNCI ASING 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 harus mendukung pengurutan biner. Untuk informasi selengkapnya, lihat Jenis yang Ditentukan Pengguna 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 menunjukkan 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 jenis 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 lebih lanjut

  • 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 berakhir. Namun, ketika SET XACT_ABORT diatur ke NONAKTIF, 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 KUNCI ASING atau PERIKSA BATASAN dan pemicu, kondisi batasan dievaluasi sebelum pemicu dijalankan.

Untuk laporan pada 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

Nullability 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 tabel, pengaruh pengaturan database dan sesi dan mungkin mengambil alih 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 nullability default dari jenis data. Kolom jarang harus selalu mengizinkan 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 nullability 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 diutamakan. jenis data tanda waktu harus BUKAN NULL. Ketika pengaturan sesi apa pun diatur AKTIF dengan menggunakan SET:
ANSI_NULL_DFLT_ON = ON, NULL ditetapkan.
ANSI_NULL_DFLT_OFF = ON, NOT NULL ditetapkan.

Ketika pengaturan database apa pun dikonfigurasi dengan menggunakan ALTER DATABASE:
ANSI_NULL_DEFAULT_ON = ON, NULL ditetapkan.
ANSI_NULL_DEFAULT_OFF = ON, 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 nullability dari jenis kolom ini, gunakan COLUMNPROPERTY fungsi dengan properti AllowsNull .

Catatan

Driver ODBC SQL Server 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.

Pemadatan 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 Kompresi Data.

Untuk mengevaluasi bagaimana mengubah status pemadatan 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

J. 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. Gunakan batasan KUNCI ASING

Batasan KUNCI ASING digunakan untuk mereferensikan tabel lain. Kunci asing dapat berupa kunci kolom tunggal atau kunci multikolom. Contoh berikut menunjukkan batasan KUNCI ASING 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. Nama kolom tidak harus sama di kedua tabel.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Batasan kunci multikolom dibuat sebagai batasan tabel. AdventureWorks2022 Dalam database, 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, AdventureWorks2022 database 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 batasan 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 tertentu.

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

F. Perlihatkan definisi tabel lengkap

Contoh berikut menunjukkan definisi tabel lengkap dengan semua definisi batasan untuk tabel PurchaseOrderDetail yang AdventureWorks2022 dibuat dalam database. 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 kumpulan 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 UNIQUEIDENTIFIER 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 menyediakan 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: SQL Server 2022 (16.x) dan versi yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance.

Contoh berikut membuat tabel yang menggunakan kompresi XML.

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 2016 (13.x) dan yang lebih baru, dan Azure SQL Database.

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. Tabel temporal harus memiliki kunci utama 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 dalam 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 2016 (13.x) dan yang lebih baru, dan Azure SQL Database.

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 terlingkup 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 satu 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 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 satu 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