Default Constraints (ràng buộc default) trong sql server

Default Constraints được sử dụng khi chúng ta muốn một giá trị được gán mặc định vào một cột của bảng mà chúng ta không cần chỉ định giá trị của cột đó trong khi thực hiện câu lệnh INSERT

Tạo Default Constraints

Default Constraints có thể được tạo trong lúc tạo bảng hoặc được thêm vào bảng đã được tạo trước đó, dưới đây là một ví dụ minh họa về cách tạo Default Constraints trong quá trình tạo một bảng 

/*Tất cả ví dụ của bài viết sẽ được thực hiện trên AZSqlserver database nên trước khi đi vào phần demo bên dưới chúng ta sẽ tạo database này */

USE master
GO

/*Xóa AZSqlserver database nếu database này đã tồn tại trước đó*/
IF DB_ID('AZSqlserver') IS NOT NULL
BEGIN 
	ALTER DATABASE AZSqlserver SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
	DROP DATABASE AZSqlserver ;
END 

/*Tạo AZSqlserver database*/
CREATE DATABASE AZSqlserver
GO
 
/*Chúng ta bắt đầu tạo Default Constraints trên cột CreatedDate của bảng Customer*/
USE AZSqlserver
GO

CREATE TABLE dbo.Customer
(
	CustomerId		INT
	,CustomerName	VARCHAR(50)
	,CreatedDate		DATETIME DEFAULT (GETDATE())
)

Trong phần mềm SQL Server Management Studio bạn ấn vào View → Object Explorer → Databases → AZSqlserver → Tables → dbo.Customer → Constraints để xem thông tin default constraint vừa mới được tạo ra

Hình 1

một constraint được tạo ra có tên là DF__Customer__Create__239E4DCF tên này được tạo tự động nên rất khó để sử dụng lại trong quá trình chỉnh sửa sau này, đồng thời nhìn vào constraint này ta cũng không thật sự biết chắc chắn mục đích của constraint này là gì, để biết điều đó ta chọn chuột phải → Scripts constraint as → CREATE To → New Query Editor Window 

Hình 2

Sau khi chọn New Query Editor Window sẽ có một cửa sổ hiện ra cho ta đầy đủ thông tin về constraint này 

Hình 3

ta cũng có thể xem thông tin constraint của một bảng bằng câu lệnh sau đây: 

USE AZSqlserver
GO

sp_help 'dbo.Customer'

Kết quả : 

Hình 4

ở đây liệt kê tất cả thông tin constraint của bảng customer

  • constraint_type = DEFAULT on column CreatedDate, cho ta biết đây là loại default constraint và được đặt trên cột CreatedDate
  • Constraint_name = DF__Customer__Create__239E4DCF, cho ta biết tên của default constraint này 
  • constraint_keys = (getdate()) là giá trị thêm vào cột CreatedDate khi thực hiện câu lệnh INSERT mà default constraint này cung cấp 
  • 4 cột còn lại delete_action, update_action, status_enabled, status_for_replication được dùng cho những loại constraint khác mình sẽ giới thiệu trong những bài viết tiếp theo 

Trong thực tế, để dễ dàng hơn trong quá trình quản lý, cũng như chỉnh sửa constraint sau này thay vì để sql server tự động tạo ra tên constraint là DF__Customer__Create__239E4DCF chúng ta sẽ tự định nghĩa tên cụ thể bằng cách thực hiện câu lệnh như sau : 

USE [AZSqlserver]
GO

DROP TABLE IF EXISTS dbo.Customer
GO

/*chúng ta định nghĩa tên của default constraint là DF_Customer_CreatedDate*/
CREATE TABLE dbo.Customer
(
	CustomerId		INT
	,CustomerName	VARCHAR(50)
	,CreatedDate	DATETIME CONSTRAINT DF_Customer_CreatedDate DEFAULT (GETDATE())
)

Kết quả : 

Hình 5

Nhìn vào cách đặt tên của constraint này ta dễ dàng nhận biết được đây là default constraint được đặt trên cột CreatedDate của bảng Customer

Nếu bảng cần thêm default constraint đã được tạo ra trước đó, chúng ta có thể thêm constraint bằng cách sử dụng câu lệnh ALTER TABLE như sau : 

USE [AZSqlserver]
GO

DROP TABLE IF EXISTS dbo.Customer
GO

/*Tạo bảng Customer, ban đầu chưa có default constraint*/
CREATE TABLE dbo.Customer
(
	CustomerId		INT
	,CustomerName	VARCHAR(50)
	,CreatedDate	DATETIME 
)
GO

/*Thêm default constraint vào bảng Customer*/
ALTER TABLE Customer ADD CONSTRAINT DF_Customer_CreatedDate  DEFAULT(GETDATE()) FOR CreatedDate
GO

Kết quả : 

Hình 6

default constraint đã được tạo ra như các cách thực hiện trước đó

Tiếp theo, chúng ta sẽ insert dữ liệu vào bảng này để thấy rõ thêm chức năng của constraint này  

INSERT INTO dbo.Customer (CustomerId, CustomerName, CreatedDate)
VALUES (1, 'CustomerName 1', '2025-01-20')

cùng kiểm tra dữ liệu của bảng sau khi insert một dòng mới 

Hình 7

Ở đây cột CreatedDate có giá trị là ‘2025-01-20 00:00:00.000’ đúng bằng giá trị ta insert vào

Bây giờ hãy thực hiện một câu lệnh insert khác trong đó chúng ta không chỉ định bất cứ giá trị nào cho cột CreatedDate 

INSERT INTO dbo.Customer (CustomerId, CustomerName)
VALUES (2, 'CustomerName 2')

Kết quả :

Hình 8

giá trị mặc định tại thời điểm chạy câu lệnh đã được insert vào, nói cách khác, tại thời điểm chạy câu lệnh insert trên, vì chúng ta bỏ qua cột CreatedDate nên cột này sẽ tự động lấy giá trị từ hàm GETDATE() làm giá trị của nó

bạn nên biết constraint này chỉ hoạt động khi ta sử dụng câu lệnh INSERT (hoặc SET DEFAULT được sử dụng trong một foreign key constraint). Giá trị mặc định của default constraint sẽ không được tự động thêm vào khi bạn sử dụng câu lệnh UPDATE. Để minh họa cho điều này, ta sẽ thử update CustomerName của dòng có CustomerId = 1

UPDATE dbo.Customer
	SET CustomerName = 'CustomerName1_1'
WHERE CustomerId = 1

Kết quả :

Hình 9

ta thấy giá trị CreatedDate vẫn không thay đổi

Từ khóa DEFAULT 

Nếu chúng ta muốn sử dụng giá trị được tạo ra bởi default constraint trong khi thực hiện câu lệnh INSERT, chúng ta có thể làm như cách chúng ta đã làm trước đó là bỏ cột có default constraint đặt trên nó trong câu lệnh INSERT. Tuy nhiên để rõ ràng hơn, chúng ta có thể dùng một cách khác là vẫn giữ cột này và thêm từ khóa DEFAULT như là giá trị cần thêm vào của nó, giống như ví dụ dưới đây : 

INSERT INTO dbo.Customer (CustomerId, CustomerName, CreatedDate)
VALUES (3, 'CustomerName3', DEFAULT)

Kết quả :

Hình 10

ta thấy giá trị mặc định của cột CreatedDate ứng với CustomerId = 3 đã tự động được tạo ra 

Cách để gỡ default constraint

Để gỡ default constraint ta dùng câu lệnh ALTER TABLE như sau : 

ALTER TABLE dbo.Customer DROP CONSTRAINT DF_Customer_CreatedDate

Kết quả : 

Hình 11

Lúc này default constraint đã bị xóa, nên thư mục Constraints ta thấy không hiển thị thông tin của default constraint như ta thấy trước đó

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *