Tổng quan về Database Data Integrity
Data Integrity (tính toàn vẹn dữ liệu) là một khái niệm quan trọng trong quản lý cơ sở dữ liệu, đảm bảo rằng dữ liệu được lưu trữ trong cơ sở dữ liệu luôn chính xác, đáng tin cậy và nhất quán. Tính toàn vẹn dữ liệu giúp ngăn chặn việc nhập dữ liệu sai hoặc không đúng định dạng, đồng thời bảo vệ dữ liệu khỏi các sự cố, lỗi phần mềm hoặc tác động từ bên ngoài.
Có bốn loại tính toàn vẹn dữ liệu chính trong cơ sở dữ liệu:
- Entity Integrity (tính toàn vẹn thực thể): Entity Integrity đảm bảo rằng mỗi bản ghi (record) trong bảng dữ liệu có một định danh duy nhất và không trùng lặp. Trong cơ sở dữ liệu quan hệ, điều này thường được thực hiện bằng cách sử dụng khóa chính (primary key) cho mỗi bảng.
- Domain Integrity (tính toàn vẹn miền): Domain Integrity đảm bảo rằng dữ liệu nhập vào cơ sở dữ liệu phải tuân theo các ràng buộc về kiểu dữ liệu, định dạng và phạm vi giá trị cho phép. Ví dụ, một trường ngày sinh không được chứa ký tự chữ cái, và một trường số điện thoại chỉ được chứa các chữ số.
- Referential Integrity (tính toàn vẹn tham chiếu): Referential Integrity đảm bảo rằng mối quan hệ giữa các bảng dữ liệu được duy trì đúng đắn. Trong cơ sở dữ liệu quan hệ, điều này thường được thực hiện bằng cách sử dụng khóa ngoại (foreign key) để liên kết dữ liệu giữa các bảng. Referential Integrity ngăn chặn việc xóa hoặc thay đổi dữ liệu một cách tùy tiện, gây ra mất đồng bộ giữa các bảng.
- User-Defined Integrity (tính toàn vẹn do người dùng định nghĩa): User-Defined Integrity cho phép người quản trị cơ sở dữ liệu định nghĩa các ràng buộc dữ liệu tuỳ chỉnh, phù hợp với yêu cầu và quy tắc kinh doanh của tổ chức. Ví dụ, một ràng buộc có thể yêu cầu số lượng hàng
Các loại tính toàn vẹn dữ liệu
-
Entity Integrity (tính toàn vẹn thực thể)
-
Domain Integrity (tính toàn vẹn miền)
- Kiểm tra kiểu dữ liệu (DATA TYPE), định dạng (FORMAT) và phạm vi giá trị (VALUE RANGE)
- Kiểm tra ràng buộc NOT NULL, NULL
- Kiểm tra ràng buộc UNIQUE
- Kiểm tra ràng buộc CHECK
- Kiểm tra ràng buộc DEFAULT VALUE
-
Referential Integrity (tính toàn vẹn tham chiếu)
- Kiểm tra ràng buộc FOREIGN KEY
- Kiểm tra ràng buộc ON DELETE (CASCADE, SET NULL, SET DEFAULT, NO ACTION)
- Kiểm tra ràng buộc ON UPDATE (CASCADE, SET NULL, SET DEFAULT, NO ACTION)
-
User-Defined Integrity (tính toàn vẹn do người dùng định nghĩa)
- Ví dụ về email phải có định d ạng đúng
Entity Integrity - Kiểm tra PRIMARY KEY
Để kiểm tra một bảng có khóa chính (primary key) hay không, bạn có thể sử dụng các câu lệnh truy vấn tùy thuộc vào hệ quản trị cơ sở dữ liệu (RDBMS) mà bạn đang sử dụng. Dưới đây là các ví dụ cho một số RDBMS phổ biến:
SQL Server
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1
AND TABLE_NAME = '<table_name>' AND COLUMN_NAME IN ('<column_name_1>', '<column_name_2>');
SELECT NAME, IS_IDENTITY, SEED_VALUE, INCREMENT_VALUE FROM [sys].[identity_columns]
WHERE object_id = OBJECT_ID('<table_name>')
AND [name] = '<column_name>'
AND [seed_value] = 1
AND [increment_value] = 1
Thay thế <table_name>
bằng tên bảng mà bạn muốn kiểm tra. Nếu câu truy vấn trả về kết quả, đó chính là tên của khóa chính trong bảng.
Domain Integrity - Kiểm tra UNIQUE
SQL Server
SELECT
i.name AS constraint_name,
t.name AS table_name,
c.name AS column_name
FROM sys.indexes i
INNER JOIN sys.index_columns ic
ON i.index_id = ic.index_id AND i.object_id = ic.object_id
INNER JOIN sys.tables AS t
ON t.object_id = i.object_id
INNER JOIN sys.columns c
ON t.object_id = c.object_id AND ic.column_id = c.column_id
WHERE
i.is_unique_constraint = 1
AND t.name = '<table_name>'
AND c.name = '<column_name>'
Thay thế <table_name>
bằng tên bảng và <column_name>
bằng tên cột mà bạn muốn kiểm tra.
Domain Integrity - Kiểm tra DATATYPE
Để kiểm tra kiểu dữ liệu của các cột trong một bảng, bạn có thể sử dụng các câu lệnh truy vấn tùy thuộc vào hệ quản trị cơ sở dữ liệu (RDBMS) mà bạn đang sử dụng. Dưới đây là các ví dụ cho một số RDBMS phổ biến:
SQL Server
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table_name>' AND COLUMN_NAME = '<column_name>' AND CHARACTER_MAXIMUM_LENGTH = <character_length>;
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table_name>' AND COLUMN_NAME = '<column_name>' AND NUMERIC_PRECISION = <precision> AND NUMERIC_SCALE = <scale>;
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table_name>' AND COLUMN_NAME = '<column_name>' AND NUMERIC_PRECISION = <precision> AND NUMERIC_SCALE = <scale>;
Thay thế <table_name>
bằng tên bảng và <column_name>
bằng tên cột mà bạn muốn kiểm tra.
Sau khi thực hiện câu truy vấn trên hệ quản trị cơ sở dữ liệu của bạn, bạn sẽ nhận được kết quả với các cột và kiểu dữ liệu tương ứng của chúng. Bạn có thể dễ dàng kiểm tra và so sánh kiểu dữ liệu của các cột để đảm bảo chúng đúng với yêu cầu của bạn.
Domain Integrity - Kiểm tra NOT NULL
Để kiểm tra các ràng buộc NOT NULL trong một bảng, bạn có thể sử dụng các câu lệnh truy vấn tùy thuộc vào hệ quản trị cơ sở dữ liệu (RDBMS) mà bạn đang sử dụng. Dưới đây là các ví dụ cho một số RDBMS phổ biến:
SQL Server
SELECT COLUMN_NAME, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = '<table_name>'
AND COLUMN_NAME = '<column_name>'
AND IS_NULLABLE = 'NO';
Thay thế <table_name>
bằng tên bảng và <column_name>
bằng tên cột mà bạn muốn kiểm tra.
Sau khi thực hiện câu truy vấn trên hệ quản trị cơ sở dữ liệu của bạn, bạn sẽ nhận được kết quả với thông tin về các cột có ràng buộc NOT NULL. Bạn có thể dễ dàng kiểm tra và so sánh các cột để đảm bảo chúng đúng với yêu cầu của bạn.
Domain Integrity - Kiểm tra DEFAULT VALUE
Để kiểm tra giá trị mặc định (DEFAULT VALUE) của các cột trong một bảng, bạn có thể sử dụng các câu lệnh truy vấn tùy thuộc vào hệ quản trị cơ sở dữ liệu (RDBMS) mà bạn đang sử dụng. Dưới đây là các ví dụ cho một số RDBMS phổ biến:
SQL Server
SELECT COLUMN_NAME, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = '<table_name>'
AND COLUMN_NAME = '<column_name>'
AND COLUMN_DEFAULT IS NOT NULL;
Thay thế <table_name>
bằng tên bảng và <column_name>
bằng tên cột mà bạn muốn kiểm tra.
Sau khi thực hiện câu truy vấn trên hệ quản trị cơ sở dữ liệu của bạn, bạn sẽ nhận được kết quả với thông tin về các cột có giá trị mặc định (DEFAULT VALUE). Bạn có thể dễ dàng kiểm tra và so sánh các cột để đảm bảo chúng đúng với yêu cầu của bạn.
Domain Integrity - Kiểm tra CHECK CONSTRANT
Để kiểm tra ràng buộc CHECK trong một bảng, bạn có thể sử dụng các câu lệnh truy vấn tùy thuộc vào hệ quản trị cơ sở dữ liệu (RDBMS) mà bạn đang sử dụng. Dưới đây là các ví dụ cho một số RDBMS phổ biến:
Trong MySQL, CHECK CONSTRAINT chỉ được giới thiệu từ phiên bản 8.0.16 trở lên. Để kiểm tra ràng buộc CHECK trong MySQL, bạn có thể sử dụng câu lệnh sau:
SQL Server
SELECT NAME, DEFINITION
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID('<table_name>')
AND parent_column_id = COLUMNPROPERTY(OBJECT_ID('<table_name>'), '<column_name>', 'ColumnId');
Thay thế <table_name>
bằng tên bảng và <column_name>
bằng tên cột mà bạn muốn kiểm tra.
Sau khi thực hiện câu truy vấn trên hệ quản trị cơ sở dữ liệu của bạn, bạn sẽ nhận được kết quả với thông tin về các ràng buộc CHECK và điều kiện tương ứng của chúng. Bạn có thể dễ dàng kiểm tra và so sánh các ràng buộc để đảm bảo chúng đúng với yêu cầu của bạn.
Referential Integrity - Kiểm tra tham chiếu khóa ngoại
Để kiểm tra tham chiếu khóa ngoại (foreign key) trong một bảng, bạn có thể sử dụng các câu lệnh truy vấn tùy thuộc vào hệ quản trị cơ sở dữ liệu (RDBMS) mà bạn đang sử dụng. Dưới đây là các ví dụ cho một số RDBMS phổ biến:
SQL Server
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME(f.referenced_object_id) AS ReferencedTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferencedColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
WHERE OBJECT_NAME(f.parent_object_id) = '<table_name>' AND COL_NAME(fc.parent_object_id, fc.parent_column_id) = '<column_name>'
Thay thế <table_name>
bằng tên bảng và <column_name>
bằng tên cột mà bạn muốn kiểm tra.
Thay thế <table_name>
bằng tên bảng mà bạn muốn kiểm tra.
Sau khi thực hiện câu truy vấn trên hệ quản trị cơ sở dữ liệu của bạn, bạn sẽ nhận được kết quả với thông tin về các khóa ngoại, bảng liên quan và cột liên quan. Bạn có thể dễ dàng kiểm tra và so sánh các mối quan hệ giữa các bảng để đảm bảo chúng đúng với yêu cầu của bạn.