CREATE SEQUENCE (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Membuat objek urutan dan menentukan propertinya. Urutannya adalah objek terikat skema yang ditentukan pengguna yang menghasilkan urutan nilai numerik sesuai dengan spesifikasi yang urutannya dibuat. Urutan nilai numerik dihasilkan dalam urutan naik atau turun pada interval yang ditentukan dan dapat dikonfigurasi untuk memulai ulang (siklus) ketika habis. Urutan, tidak seperti kolom identitas, tidak terkait dengan tabel tertentu. Aplikasi merujuk ke objek urutan untuk mengambil nilai berikutnya. Hubungan antara urutan dan tabel dikontrol oleh aplikasi. Aplikasi pengguna dapat mereferensikan objek urutan dan mengoordinasikan nilai di beberapa baris dan tabel.

Tidak seperti nilai kolom identitas yang dihasilkan saat baris disisipkan, aplikasi dapat memperoleh nomor urutan berikutnya tanpa menyisipkan baris dengan memanggil fungsi NEXT VALUE FOR. Gunakan sp_sequence_get_range untuk mendapatkan beberapa nomor urut sekaligus.

Untuk informasi dan skenario yang menggunakan CREATE SEQUENCE dan fungsi NEXT VALUE FOR , lihat Nomor Urutan.

Konvensi sintaks transact-SQL

Sintaksis

CREATE SEQUENCE [schema_name . ] sequence_name  
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]  
    [ START WITH <constant> ]  
    [ INCREMENT BY <constant> ]  
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]  
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]  
    [ CYCLE | { NO CYCLE } ]  
    [ { CACHE [ <constant> ] } | { NO CACHE } ]  
    [ ; ]  

Catatan

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

Argumen

sequence_name
Menentukan nama unik yang urutannya diketahui dalam database. Jenisnya adalah sysname.

[ built_in_integer_type | defined_integer_type pengguna
Urutan dapat didefinisikan sebagai jenis bilangan bulat apa pun. Jenis berikut diperbolehkan.

  • tinyint - Rentang 0 hingga 255
  • smallint - Rentang -32.768 hingga 32.767
  • int - Rentang -2.147.483.648 hingga 2.147.483.647
  • bigint - Rentang -9.223.372.036.854.775.808 hingga 9.223.372.036.854.775.807
  • desimal dan numerik dengan skala 0.
  • Jenis data yang ditentukan pengguna (jenis alias) yang didasarkan pada salah satu jenis yang diizinkan.

Jika tidak ada jenis data yang disediakan, jenis data bigint digunakan sebagai default.

MULAI DENGAN <konstanta>
Nilai pertama yang dikembalikan oleh objek urutan. Nilai START harus berupa nilai yang kurang dari atau sama dengan maksimum dan lebih besar dari atau sama dengan nilai minimum objek urutan. Nilai awal default untuk objek urutan baru adalah nilai minimum untuk objek urutan naik dan nilai maksimum untuk objek urutan turun.

INCREMENT BY <konstanta>
Nilai yang digunakan untuk menaikkan (atau mengurangi jika negatif) nilai objek urutan untuk setiap panggilan ke fungsi NEXT VALUE FOR . Jika kenaikan adalah nilai negatif, objek urutan turun; jika tidak, itu naik. Kenaikan tidak boleh 0. Kenaikan default untuk objek urutan baru adalah 1.

[ KONSTANTA> MINVALUE <| TIDAK ADA MINVALUE ]
Menentukan batas untuk objek urutan. Nilai minimum default untuk objek urutan baru adalah nilai minimum dari jenis data objek urutan. Ini nol untuk jenis data kecil dan angka negatif untuk semua jenis data lainnya.

[ Konstanta> MAXVALUE <| TIDAK ADA MAXVALUE
Menentukan batas untuk objek urutan. Nilai maksimum default untuk objek urutan baru adalah nilai maksimum dari jenis data objek urutan.

[ SIKLUS | TIDAK ADA SIKLUS ]
Properti yang menentukan apakah objek urutan harus dimulai ulang dari nilai minimum (atau maksimum untuk objek urutan menurun) atau melempar pengecualian ketika nilai minimum atau maksimumnya terlampaui. Opsi siklus default untuk objek urutan baru adalah NO CYCLE.

Catatan

Bersepeda SEQUENCE dimulai ulang dari nilai minimum atau maksimum, bukan dari nilai awal.

[ CACHE [<konstan> ] | TIDAK ADA CACHE ]
Meningkatkan performa untuk aplikasi yang menggunakan objek urutan dengan meminimalkan jumlah IO disk yang diperlukan untuk menghasilkan nomor urut. Default ke CACHE.

Misalnya, jika ukuran cache 50 dipilih, SQL Server tidak menyimpan 50 nilai individual yang di-cache. Ini hanya menyimpan nilai saat ini dan jumlah nilai yang tersisa dalam cache. Ini berarti bahwa jumlah memori yang diperlukan untuk menyimpan cache selalu dua instans dari jenis data objek urutan.

Catatan

Jika opsi cache diaktifkan tanpa menentukan ukuran cache, Mesin Database akan memilih ukuran. Namun, pengguna tidak boleh mengandalkan pilihan yang konsisten. Microsoft mungkin mengubah metode menghitung ukuran cache tanpa pemberitahuan.

Saat dibuat dengan opsi CACHE , pematian yang tidak terduga (seperti kegagalan daya) dapat mengakibatkan hilangnya nomor urutan yang tersisa di cache.

Keterangan Umum

Nomor urut dihasilkan di luar cakupan transaksi saat ini. Mereka dikonsumsi apakah transaksi menggunakan nomor urut diterapkan atau digulung balik. Validasi duplikat hanya terjadi setelah rekaman diisi sepenuhnya. Ini dapat mengakibatkan beberapa kasus di mana angka yang sama digunakan untuk lebih dari satu rekaman selama pembuatan, tetapi kemudian diidentifikasi sebagai duplikat. Jika ini terjadi dan nilai autonumber lainnya telah diterapkan ke rekaman berikutnya, ini dapat mengakibatkan kesenjangan antara nilai autonumber dan perilaku yang diharapkan.

Manajemen singgahan

Untuk meningkatkan performa, SQL Server telah mengalokasikan jumlah nomor urut yang ditentukan oleh argumen CACHE .

Misalnya, urutan baru dibuat dengan nilai awal 1 dan ukuran cache 15. Ketika nilai pertama diperlukan, nilai 1 hingga 15 tersedia dari memori. Nilai cache terakhir (15) ditulis ke tabel sistem pada disk. Ketika ke-15 angka digunakan, permintaan berikutnya (untuk nomor 16) akan menyebabkan cache dialokasikan lagi. Nilai cache terakhir baru (30) akan ditulis ke tabel sistem.

Jika Mesin Database dihentikan setelah Anda menggunakan 22 angka, nomor urutan berikutnya yang dimaksudkan dalam memori (23) ditulis ke tabel sistem, menggantikan nomor yang disimpan sebelumnya.

Setelah SQL Server dimulai ulang dan nomor urut diperlukan, nomor awal dibaca dari tabel sistem (23). Jumlah cache 15 angka (23-38) dialokasikan untuk memori dan nomor non-cache berikutnya (39) ditulis ke tabel sistem.

Jika Mesin Database berhenti secara tidak normal untuk peristiwa seperti kegagalan daya, urutan dimulai ulang dengan angka yang dibaca dari tabel sistem (39). Nomor urutan apa pun yang dialokasikan untuk memori (tetapi tidak pernah diminta oleh pengguna atau aplikasi) hilang. Fungsionalitas ini dapat meninggalkan celah, tetapi menjamin bahwa nilai yang sama tidak akan pernah dikeluarkan dua kali untuk satu objek urutan kecuali didefinisikan sebagai CYCLE atau dimulai ulang secara manual.

Cache dipertahankan dalam memori dengan melacak nilai saat ini (nilai terakhir yang dikeluarkan) dan jumlah nilai yang tersisa dalam cache. Oleh karena itu, jumlah memori yang digunakan oleh cache selalu dua instans dari jenis data objek urutan.

Mengatur argumen cache ke NO CACHE menulis nilai urutan saat ini ke tabel sistem setiap kali urutan digunakan. Ini mungkin memperlambat performa dengan meningkatkan akses disk, tetapi mengurangi kemungkinan kesenjangan yang tidak diinginkan. Celah masih dapat terjadi jika angka diminta menggunakan fungsi NEXT VALUE FOR atau sp_sequence_get_range , tetapi kemudian angka tidak digunakan atau digunakan dalam transaksi yang tidak dilakukan.

Ketika objek urutan menggunakan opsi CACHE, jika Anda memulai ulang objek urutan, atau mengubah properti INCREMENT, CYCLE, MINVALUE, MAXVALUE, atau ukuran cache, itu akan menyebabkan cache ditulis ke tabel sistem sebelum perubahan terjadi. Kemudian cache dimuat ulang dimulai dengan nilai saat ini (yaitu tidak ada angka yang dilewati). Mengubah ukuran cache akan segera berlaku.

Opsi CACHE saat nilai yang di-cache tersedia

Proses berikut terjadi setiap kali objek urutan diminta untuk menghasilkan nilai berikutnya untuk opsi CACHE jika ada nilai yang tidak digunakan yang tersedia di cache dalam memori untuk objek urutan.

  1. Nilai berikutnya untuk objek urutan dihitung.

  2. Nilai baru saat ini untuk objek urutan diperbarui dalam memori.

  3. Nilai terhitung dikembalikan ke pernyataan panggilan.

Opsi CACHE saat cache habis

Proses berikut terjadi setiap kali objek urutan diminta untuk menghasilkan nilai berikutnya untuk opsi CACHE jika cache telah habis:

  1. Nilai berikutnya untuk objek urutan dihitung.

  2. Nilai terakhir untuk cache baru dihitung.

  3. Baris tabel sistem untuk objek urutan dikunci, dan nilai yang dihitung di langkah 2 (nilai terakhir) ditulis ke tabel sistem. Xevent yang kelelahan cache diaktifkan untuk memberi tahu pengguna tentang nilai persisten baru.

Tidak ada opsi CACHE

Proses berikut terjadi setiap kali objek urutan diminta untuk menghasilkan nilai berikutnya untuk opsi TIDAK ADA CACHE :

  1. Nilai berikutnya untuk objek urutan dihitung.

  2. Nilai baru saat ini untuk objek urutan ditulis ke tabel sistem.

  3. Nilai terhitung dikembalikan ke pernyataan panggilan.

Metadata

Untuk informasi tentang urutan, kueri sys.sequences.

Keamanan

Izin

Memerlukan izin CREATE SEQUENCE, ALTER, atau CONTROL pada SKEMA.

  • Anggota peran database tetap db_owner dan db_ddladmin dapat membuat, mengubah, dan menghilangkan objek urutan.

  • Anggota peran database tetap db_owner dan db_datawriter dapat memperbarui objek urutan dengan menyebabkannya menghasilkan angka.

Contoh berikut memberikan izin AdventureWorks\Larry kepada pengguna untuk membuat urutan dalam skema Pengujian.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO [AdventureWorks\Larry]  

Kepemilikan objek urutan dapat ditransfer dengan menggunakan pernyataan ALTER AUTHORIZATION .

Jika urutan menggunakan jenis data yang ditentukan pengguna, pembuat urutan harus memiliki izin REFERENCES pada jenis tersebut.

Audit

Untuk mengaudit CREATE SEQUENCE, pantau SCHEMA_OBJECT_CHANGE_GROUP.

Contoh

Untuk contoh pembuatan urutan dan menggunakan fungsi NEXT VALUE FOR untuk menghasilkan nomor urut, lihat Nomor Urutan.

Sebagian besar contoh berikut membuat objek urutan dalam skema bernama Test.

Untuk membuat skema Uji, jalankan pernyataan berikut.

CREATE SCHEMA Test ;  
GO  

J. Membuat urutan yang meningkat sebesar 1

Dalam contoh berikut, Thierry membuat urutan bernama CountBy1 yang meningkat satu per satu setiap kali digunakan.

CREATE SEQUENCE Test.CountBy1  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

B. Membuat urutan yang berkurang 1

Contoh berikut dimulai pada 0 dan dihitung menjadi angka negatif satu per satu setiap kali digunakan.

CREATE SEQUENCE Test.CountByNeg1  
    START WITH 0  
    INCREMENT BY -1 ;  
GO  

C. Membuat urutan yang meningkat sebesar 5

Contoh berikut membuat urutan yang meningkat sebesar 5 setiap kali digunakan.

CREATE SEQUENCE Test.CountBy1  
    START WITH 5  
    INCREMENT BY 5 ;  
GO  

D. Membuat urutan yang dimulai dengan angka yang ditunjuk

Setelah mengimpor tabel, Thierry melihat bahwa angka ID tertinggi yang digunakan adalah 24.328. Thierry membutuhkan urutan yang akan menghasilkan angka mulai dari 24.329. Kode berikut membuat urutan yang dimulai dengan 24.329 dan kenaikan 1.

CREATE SEQUENCE Test.ID_Seq  
    START WITH 24329  
    INCREMENT BY 1 ;  
GO  

E. Membuat urutan menggunakan nilai default

Contoh berikut membuat urutan menggunakan nilai default.

CREATE SEQUENCE Test.TestSequence ;  

Jalankan pernyataan berikut untuk melihat properti urutan.

SELECT * FROM sys.sequences WHERE name = 'TestSequence' ;  

Daftar parsial output menunjukkan nilai default.

Hasil Nilai default
start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Membuat urutan dengan jenis data tertentu

Contoh berikut membuat urutan menggunakan jenis data smallint , dengan rentang dari -32.768 hingga 32.767.

CREATE SEQUENCE SmallSeq 
    AS smallint ;  

G. Membuat urutan menggunakan semua argumen

Contoh berikut membuat urutan bernama DecSeq menggunakan jenis data desimal , memiliki rentang dari 0 hingga 255. Urutan dimulai dengan 125 dan kenaikan sebesar 25 setiap kali angka dihasilkan. Karena urutan dikonfigurasi untuk siklus ketika nilai melebihi nilai maksimum 200, urutan dimulai ulang pada nilai minimum 100.

CREATE SEQUENCE Test.DecSeq  
    AS decimal(3,0)   
    START WITH 125  
    INCREMENT BY 25  
    MINVALUE 100  
    MAXVALUE 200  
    CYCLE  
    CACHE 3  
;  

Jalankan pernyataan berikut untuk melihat nilai pertama; START WITH opsi 125.

SELECT NEXT VALUE FOR Test.DecSeq;  

Jalankan pernyataan tiga kali lagi untuk mengembalikan 150, 175, dan 200.

Jalankan pernyataan lagi untuk melihat bagaimana nilai awal kembali ke MINVALUE opsi 100.

Jalankan kode berikut untuk mengonfirmasi ukuran cache dan melihat nilai saat ini.

SELECT cache_size, current_value   
FROM sys.sequences  
WHERE name = 'DecSeq' ;  

Lihat Juga

ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL)
NILAI BERIKUTNYA UNTUK (Transact-SQL)
Nomor Urut