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

Menjelajahi batasan yang berbeda di SQL Server

Batasan di SQL Server adalah aturan yang telah ditentukan sebelumnya yang dapat Anda terapkan pada satu atau beberapa kolom. Batasan ini membantu menjaga integritas, keandalan, dan akurasi nilai yang disimpan dalam kolom ini. Anda dapat membuat batasan menggunakan pernyataan CREATE TABLE atau ALTER Table. Jika Anda menggunakan pernyataan ALTER TABLE, SQL Server akan memeriksa data kolom yang ada sebelum membuat batasan.

Jika Anda menyisipkan data di kolom yang memenuhi kriteria aturan batasan, SQL Server berhasil menyisipkan data. Namun, jika data melanggar batasan, pernyataan penyisipan dibatalkan dengan pesan kesalahan.

Misalnya, pertimbangkan bahwa Anda memiliki tabel [Karyawan] yang menyimpan data karyawan organisasi Anda, termasuk gaji mereka. Ada beberapa aturan praktis terkait nilai di kolom gaji.

  • Kolom tidak boleh memiliki nilai negatif seperti -10.000 atau -15,000 USD.
  • Anda juga ingin menentukan nilai gaji maksimum. Misalnya, gaji maksimum harus kurang dari 2.000.000 USD.

Jika Anda memasukkan catatan baru dengan batasan, SQL Server akan memvalidasi nilai terhadap aturan yang ditentukan.

Nilai yang dimasukkan:

Gaji 80.000:Berhasil dimasukkan

Gaji -50.000: Galat

Kami akan menjelajahi batasan berikut di SQL Server dalam artikel ini.

  • BUKAN NULL
  • UNIK
  • PERIKSA
  • KUNCI UTAMA
  • KUNCI ASING
  • DEFAULT

BUKAN batasan NULL

Secara default, SQL Server memungkinkan menyimpan nilai NULL dalam kolom. Nilai NULL ini tidak mewakili data yang valid.

Misalnya, setiap karyawan dalam suatu organisasi harus memiliki Emp ID, nama depan, jenis kelamin, dan alamat. Oleh karena itu, Anda dapat menentukan kolom dengan batasan NOT NULL untuk selalu memastikan nilai yang valid.

Skrip CREATE TABLE di bawah ini mendefinisikan batasan NOT NULL untuk kolom [ID],[FirstName],[LastName],[Gender] dan [Address].

CREATE TABLE Employees
(
ID INT NOT NULL,
[FirstName] Varchar(100) NOT NULL,
[MiddleName] Varchar(50) NULL,
[LastName] Varchar(100) NOT NULL,
[Gender] char(1) NOT NULL,
[Address] Varchar(200) NOT NULL
)

Untuk memvalidasi batasan NOT NULL, perilaku, kami menggunakan pernyataan INSERT berikut.

  • Sisipkan nilai untuk semua kolom (NULL dan NOT NULL) – Berhasil menyisipkan
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
  • Sisipkan nilai untuk kolom dengan properti NOT NULL – Berhasil menyisipkan
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2,
'Shyam','Agarwal','M','UK')
  • Lewati penyisipan nilai untuk kolom [LastName] yang memiliki batasan NOT NULL – Gagal+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')

Pernyataan INSERT terakhir memunculkan kesalahan – Tidak dapat memasukkan nilai NULL ke dalam kolom .

Tabel ini memiliki nilai-nilai berikut yang disisipkan ke dalam tabel [Karyawan].

Misalkan kita tidak memerlukan nilai NULL di kolom [MiddleName] sesuai kebutuhan HR. Untuk tujuan ini, Anda dapat menggunakan pernyataan ALTER TABLE.

ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Pernyataan ALTER TABLE ini gagal karena nilai kolom [MiddleName] yang sudah ada. Untuk menegakkan batasan, Anda perlu menghilangkan nilai NULL ini dan kemudian menjalankan pernyataan ALTER.

UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL
Go
ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Anda dapat memvalidasi batasan NOT NULL menggunakan desainer tabel SSMS juga.

batasan UNIK

Batasan UNIK di SQL Server memastikan bahwa Anda tidak memiliki nilai duplikat dalam satu kolom atau kombinasi kolom. Kolom ini harus menjadi bagian dari batasan UNIK. SQL Server secara otomatis membuat indeks saat batasan UNIK ditentukan. Anda hanya dapat memiliki satu nilai unik di kolom (termasuk NULL).

Misalnya, buat [DemoTable] dengan kolom [ID] yang memiliki batasan UNIK.

CREATE TABLE DemoTable
(
[ID] INT UNIQUE NOT NULL,
[EmpName] VARCHAR(50) NOT NULL
)

Kemudian, perluas tabel di SSMS, dan Anda memiliki indeks unik (Non-Clustered), seperti yang ditunjukkan di bawah ini.

Silakan klik kanan pada indeks dan buat skripnya. Seperti yang ditunjukkan di bawah ini, ia menggunakan kata kunci ADD UNIQUE NONCLUSTERED untuk batasannya.

Pernyataan insert berikut memberikan kesalahan karena mencoba memasukkan nilai duplikat.

INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO

PERIKSA batasan

Batasan CHECK di SQL Server mendefinisikan rentang nilai yang valid yang dapat dimasukkan ke dalam kolom tertentu. Itu mengevaluasi setiap nilai yang dimasukkan atau diubah, dan jika dipenuhi, pernyataan SQL berhasil diselesaikan.

Skrip SQL berikut menempatkan batasan untuk kolom [Usia]. Nilainya harus lebih besar dari 18 tahun.

CREATE TABLE DemoCheckConstraint
(
ID INT PRIMARY KEY,
[EmpName] VARCHAR(50) NULL,
[Age] INT CHECK (Age>18)
)
GO

Mari kita masukkan dua record dalam tabel ini. Kueri berhasil memasukkan catatan pertama.

INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20)
Go
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17)
GO

Pernyataan INSERT kedua gagal karena tidak memenuhi kondisi kendala CHECK.

Kasus penggunaan lain untuk batasan CHECK adalah untuk menyimpan nilai kode pos yang valid. Dalam skrip di bawah ini, kami menambahkan kolom baru [ZipCode] dan menggunakan batasan CHECK untuk memvalidasi nilai.

ALTER TABLE DemoCheckConstraint ADD zipcode int
GO
ALTER TABLE DemoCheckConstraint
ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))

Batasan CHECK ini tidak mengizinkan kode pos yang tidak valid. Misalnya, pernyataan INSERT kedua menghasilkan kesalahan.

INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203)
Go
INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)

batasan KUNCI UTAMA

Batasan PRIMARY KEY di SQL Server adalah pilihan populer di kalangan profesional database untuk menerapkan nilai unik dalam tabel relasional. Ini menggabungkan batasan UNIK dan NOT NULL. SQL Server secara otomatis membuat indeks berkerumun setelah kami menentukan batasan PRIMARY KEY. Anda dapat menggunakan satu kolom atau sekumpulan kombinasi untuk menentukan nilai unik dalam satu baris.

Tujuan utamanya adalah untuk menegakkan integritas tabel menggunakan entitas unik atau nilai kolom.

Ini mirip dengan batasan UNIK dengan perbedaan berikut.

KUNCI UTAMA KUNCI UNIK
Ini menggunakan pengenal unik untuk setiap baris dalam tabel. Ini secara unik mendefinisikan nilai dalam kolom tabel.
Anda tidak dapat memasukkan nilai NULL di kolom PRIMARY KEY. Dapat menerima satu nilai NULL di kolom kunci unik.
Sebuah tabel hanya dapat memiliki satu batasan PRIMARY KEY. Anda dapat membuat beberapa batasan KUNCI UNIK di SQL Server.
Secara default, ini membuat indeks berkerumun untuk kolom PRIMARY KEY. UNIK KUNCI membuat indeks non-cluster untuk kolom kunci utama.

Script berikut mendefinisikan PRIMARY KEY pada kolom ID.

CREATE TABLE PrimaryKeyDemo
(
ID INT PRIMARY KEY,
[Name] VARCHAR(100) NULL
)

Seperti yang ditunjukkan di bawah ini, Anda memiliki indeks kunci berkerumun setelah mendefinisikan KUNCI UTAMA pada kolom ID.

Mari masukkan record ke dalam tabel [PrimaryKeyDemo] dengan pernyataan INSERT berikut.

INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj')
GO
INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan')
GO

Anda mendapatkan kesalahan dalam pernyataan INSERT kedua karena mencoba memasukkan nilai NULL.

Demikian pula, jika Anda mencoba memasukkan nilai duplikat, Anda mendapatkan pesan kesalahan berikut.

batasan KUNCI ASING

Batasan FOREIGN KEY di SQL Server membuat hubungan antara dua tabel. Hubungan ini dikenal sebagai hubungan orang tua-anak. Ini memberlakukan integritas referensial di SQL Server.

Kunci asing tabel anak harus memiliki entri yang sesuai di kolom kunci utama induk. Anda tidak dapat menyisipkan nilai di tabel anak tanpa menyisipkannya di tabel induk terlebih dahulu. Demikian pula, pertama-tama, kita perlu menghapus nilai dari tabel anak sebelum dapat dihapus dari tabel induk.

Karena kami tidak dapat memiliki nilai duplikat dalam batasan PRIMARY KEY, itu juga tidak mengizinkan duplikat atau NULL di tabel anak.

Skrip SQL berikut membuat tabel induk dengan kunci utama dan tabel anak dengan referensi kunci utama dan asing ke kolom tabel induk [EmpID].

CREATE TABLE ParentTable
(
[EmpID] INT PRIMARY KEY,
[Name] VARCHAR(50) NULL
)
GO
CREATE TABLE ChildTable
(
[ID] INT PRIMARY KEY,
[EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID)
)

Sisipkan catatan di kedua tabel. Perhatikan bahwa nilai kunci asing tabel anak memiliki entri di tabel induk.

INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal')
INSERT INTO ChildTable VALUES (101,1),(102,2)

Jika Anda mencoba menyisipkan record secara langsung di tabel anak yang tidak mereferensikan kunci utama tabel induk, Anda akan mendapatkan pesan kesalahan berikut.

batasan DEFAULT

Batasan DEFAULT di SQL Server memberikan nilai default untuk kolom. Jika kita tidak menentukan nilai dalam pernyataan INSERT untuk kolom dengan batasan DEFAULT, SQL Server menggunakan nilai default yang ditetapkan. Misalnya, tabel pesanan memiliki catatan untuk semua pesanan pelanggan. Anda dapat menggunakan fungsi GETDATE() untuk menangkap tanggal pemesanan tanpa menentukan nilai eksplisit apa pun.

CREATE TABLE Orders
(
[OrderID] INT PRIMARY KEY,
[OrderDate] DATETIME NOT NULL DEFAULT GETDATE()
)
GO

Untuk menyisipkan record dalam tabel ini, kita dapat melewatkan penetapan nilai untuk kolom [OrderDate].

INSERT INTO Orders([OrderID]) values (1)
GO

PILIH * DARI Pesanan

Setelah kolom batasan DEFAULT menentukan nilai eksplisit, SQL Server menyimpan nilai eksplisit ini alih-alih nilai default.

Manfaat kendala

Batasan di SQL Server dapat bermanfaat dalam kasus berikut:

  • Menegakkan logika bisnis
  • Menegakkan integritas referensial
  • Mencegah penyimpanan data yang tidak benar di tabel SQL Server
  • Menegakkan keunikan untuk data kolom
  • Meningkatkan kinerja kueri karena pengoptimal kueri mengetahui data unik dan memvalidasi kumpulan nilai
  • Mencegah penyimpanan nilai NULL dalam tabel SQL
  • Menulis kode untuk menghindari NULL saat menampilkan data di aplikasi

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jalankan sp_msforeachdb dalam aplikasi Java

  2. String Format Tanggal/Waktu Standar Didukung oleh FORMAT() di SQL Server

  3. Jatuhkan semua tabel yang namanya dimulai dengan string tertentu

  4. JPA SQL Server Tidak ada pemetaan Dialek untuk tipe JDBC:-9

  5. Hapus satu catatan dari Entity Framework?