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 đó