Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pengantar Identitas SQL Server

Pada artikel ini, kita akan menjelajahi dasar-dasar dan detail properti SQL Server IDENTITY dan fitur kolom IDENTITY. Selain itu, kami akan mempertimbangkan cara menyisipkan nilai eksplisit ke kolom identitas melalui fitur IDENTITY_INSERT.

Pengantar properti SQL Server IDENTITY dan kolom IDENTITY

Di SQL Server, properti identitas memungkinkan kita untuk membuat kolom identitas di tabel SQL Server sesuai dengan pengaturan sintaks properti identitas. Sintaks properti identitas terlihat sebagai berikut, dan kami menerapkan sintaks ini untuk membuat atau mengubah pernyataan tabel.

IDENTITAS [(seed, increment)]

Pada awalnya, kami akan memeriksa parameter properti identitas. Properti ini mengambil dua parameter input:yang pertama adalah seed dan yang kedua adalah increment. Parameter seed menentukan bahwa nilai awal pertama dari nilai yang dimasukkan ke dalam tabel dan parameter Increment menentukan nilai kenaikan dari data yang dimasukkan.

Sekarang, kami akan mengintensifkan definisi utama properti identitas ini dengan beberapa contoh.

Cara membuat kolom Identitas di SQL Server

Contoh-1 :Pada contoh berikut, kita akan membuat kolom identitas dan nilai pertama akan dimulai dari 1 dan bertambah 1 dengan 1.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Baris pertama yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris kedua yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris ketiga yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris keempat yang dimasukkan')SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

Contoh-2 :Pada contoh berikut, kita akan membuat kolom identitas dan nilai pertama akan dimulai dari 37 dan bertambah 20 kali 20.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(37,20) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Baris pertama yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris kedua yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris ketiga yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris keempat yang dimasukkan')SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

Seperti yang dapat Anda lihat pada contoh di atas, properti identitas menyediakan pembuatan nilai peningkatan otomatis menurut parameter seed dan identitas.

Bagaimana cara memasukkan nilai eksplisit ke kolom identitas SQL Server?

Secara default, properti identitas tidak mengizinkan kita untuk memasukkan nilai eksplisit ke dalam kolom identitas. Jika Anda mencoba memasukkan nilai eksplisit ke dalam kolom identitas, Anda akan mengalami kesalahan berikut.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES (1,'Baris pertama yang dimasukkan')

Msg 8101, Level 16, State 1, Line 9
Nilai eksplisit untuk kolom identitas di table, 'TestIdentity' hanya dapat ditentukan bila daftar kolom digunakan dan IDENTITY_INSERT AKTIF.

Kita dapat mengatasi kesalahan ini dengan mengaktifkan fitur IDENTITY_INSERT dari tabel. Sekarang, kita akan mengubah pernyataan insert sebagai berikut.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) VALUES (1,'Baris pertama yang dimasukkan')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity

Poin penting lainnya tentang masalah ini adalah kita harus menulis daftar kolom untuk menyisipkan pernyataan. Jika kita tidak melakukan ini, kita akan mengalami kesalahan berikut.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity NILAI (1,'Baris pertama yang dimasukkan')SET IDENTITY_INSERT 

Msg 8101, Level 16, State 1, Line 9
Nilai eksplisit untuk kolom identitas di table, 'TestIdentity' hanya dapat ditentukan bila daftar kolom digunakan dan IDENTITY_INSERT AKTIF.

Kesalahan ini mendefinisikan bahwa daftar kolom tidak ada dalam pernyataan sisipan. Dalam pernyataan sisipan di bawah ini, kami akan memperbaiki kesalahan ini.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---daftar kolomVALUES (90,'Baris pertama yang dimasukkan ')SET IDENTITY_INSERT TestIdentity NONAKTIF

Dalam beberapa kasus, kita perlu memasukkan data ke satu tabel dari tabel lain. Salah satu cara terbaik untuk melakukan operasi ini adalah dengan menggunakan pernyataan “INSERT INTO SELECT”. Namun, jika tabel target memiliki kolom identitas, kita perlu mengaktifkan opsi IDENTITY_INSERT di tabel target. Juga, kita harus menulis daftar kolom dari tabel target.

DROP TABLE IF EXISTS TestIdentityDROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT,Val1 VARCHAR(100))INSERT INTO SourceTable NILAI (1,'Baris Pertama'),(2,'Baris Kedua')GOCREATE TABLE TestIdentity( ID INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTableSET IDENTITY_INSERT TestIdentity OFF

Kelemahan dari opsi IDENTITY_INSERT adalah dapat menyebabkan kesenjangan antara nilai kolom identitas. Pernyataan yang mirip dengan pernyataan berikut akan menghasilkan kesenjangan antara nilai kolom identitas.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))INSERT INTO TestIdentity ---column listVALUES ('Baris pertama yang disisipkan (INDENTITY_INSERT_OFF)')SETINS IDENTITY_INSERT TestIdentity TestIdentity (Id,Col1) ---column listVALUES (90,'Baris kedua yang disisipkan (INDENTITY_INSERT_ON')SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity ---column listVALUES ('Baris ketiga yang disisipkan (INDENTITY_INSERT_OFF)')SELECT * FROM TestIdentity 

Perintah DBCC CHECKIDENT

Perintah DBCC CHECKIDENT memungkinkan kita untuk mendapatkan detail tentang nilai terakhir kolom identitas. Fungsi ini juga memungkinkan mengatur ulang dan mengubah nilai kolom identitas saat ini ke nilai lain. Sekarang, kita akan mendapatkan nilai terakhir dari identitas melalui perintah DBCC CHECKIDENT.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Baris pertama yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris kedua yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris ketiga yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris keempat yang dimasukkan')DBCC CHECKIDENT ('TestIdentity', NORESEED)

Pilihan lain tentang perintah DBCC CHECKIDENT adalah mengatur ulang kolom identitas ke nilai yang diperlukan. Dalam contoh berikut, parameter RESEED mengubah nilai maksimal kolom identitas menjadi 100 dan nilai yang dimasukkan selanjutnya menggunakan nilai maksimal ini.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Baris pertama yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris kedua yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris ketiga yang dimasukkan')INSERT INTO TestIdentityVALUES ('Baris keempat yang dimasukkan')GODBCC CHECKIDENT ('TestIdentity',RESEED,100)GOINSERT INTO TestIdentityVALUES ('Baris kelima yang dimasukkan')SELECT * FROM TestIdentity

Kolom identitas dan keunikan SQL Server

Kolom identitas tidak menjamin pembuatan nilai unik. Ini adalah masalah umum yang membingungkan tentang kolom identitas, jadi jika kita ingin memastikan keunikan nilai yang dihasilkan, kita dapat menggunakan indeks unik untuk kolom ini. Sekarang, kami akan membuktikan dan mendemonstrasikan cara membuat nilai duplikat di atas kolom identitas.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'Baris pertama yang dimasukkan (INDENTITY_INSERT_INSERT_) )INSERT INTO TestIdentity (Id,Col1)VALUES (1,'Baris pertama yang disisipkan (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity

Selain itu, Kolom Identitas dan Kunci Utama adalah dua objek yang berbeda di SQL Server. Tujuan penggunaan kolom identitas adalah untuk menghasilkan angka yang bertambah secara otomatis. Di sisi lain, batasan kunci utama menjamin dan memberikan keunikan nilai dalam kolom tertentu. Batasan Kunci Utama memberlakukan nilai unik untuk kolom yang ditentukan karena, secara default, Kunci Utama membuat indeks unik berkerumun dalam tabel. Dalam penggunaan umum, batasan Kunci Utama dan Properti Identitas dapat digunakan bersama. Pendekatan penggunaan ini membantu kami menghadirkan fleksibilitas keunikan Kunci Utama dan fitur peningkatan otomatis Identitas ke kolom yang diterapkan. Dalam contoh berikut, kami juga akan menambahkan batasan kunci utama ke kolom Id dan itu akan mencegah duplikasi nilai yang disisipkan.

DROP TABLE JIKA ADA TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) PRIMARY KEY,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'Baris pertama yang dimasukkan (INDENTITY_INSERT_ )')INSERT INTO TestIdentity (Id,Col1)VALUES (1,'Baris pertama yang disisipkan (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity

Ketika kita menavigasi tab Indexes dari tabel TestIdentity di object explorer, kita dapat menemukan sebuah clustered index yang unik yang dibuat oleh primary key constraint. Batasan ini berlaku untuk nilai unik untuk kolom Id.

Kesimpulan

Dalam artikel ini, kami membahas konsep dasar dan metode penggunaan properti SQL Server Identity dan kolom Identitas.

Referensi

  • BUAT TABEL (Transact-SQL) IDENTITAS (Properti)
  • Buat Kunci Utama

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Solusi untuk DATEDIFF() Mengabaikan SET DATEFIRST di SQL Server (Contoh T-SQL)

  2. Bagaimana Pernyataan IF Bekerja di SQL Server

  3. Tambahkan Batasan CHECK ke Tabel yang Ada di SQL Server (T-SQL)

  4. Mencatat SEMUA Pertanyaan di Database SQL Server 2008 Express?

  5. Contoh sys.dm_sql_referenced_entities() SQL Server Mengembalikan Entitas yang Mereferensikan Server Tertaut