Ràng buộc CHECK trong MySQL
Bùi Tấn Lực
- 997
- 24/09/2025
Chức năng của Ràng buộc CHECK trong MySQL
Ràng buộc CHECK trong MySQL dùng để ràng buộc các giá trị nhập vào của các cột nhưng chấp nhận giá trị NULL.
Ràng buộc CHECK khi tạo bảng trong MySQL
Ràng buộc CHECK một cột khi tạo bảng trong MySQL
CREATE TABLE `tb_bangnhanvien` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`luong` int(11),
`tuoi` int(11),
CONSTRAINT CHE_tuoi CHECK (tuoi>17),
CONSTRAINT CHE_luong CHECK (luong>5000000)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'IhNRcn9n'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// CREATE TABLE `tb_bangnhanvien`
echo "<b>CREATE TABLE `tb_bangnhanvien`</b><br>";
$sql ="CREATE TABLE `tb_bangnhanvien` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`luong` int(11),
`tuoi` int(11),
CONSTRAINT CHE_tuoi CHECK (tuoi>17),
CONSTRAINT CHE_luong CHECK (luong>5000000)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
";
//Cột id: kiểu int giới hạn 11 ký tự, không cho phép null, PRIMARY KEY là tạo khóa chính, AUTO_INCREMENT là tự động tăng dần sau mỗi lần thêm một hàng
// Cột ten: kiểu chữ varchar giới hạn 255 ký tự, kiểu utf-8, cho phép null
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể tạo bảng: ' . mysql_error());
}else{
echo "Tạo tb_bangnhanvien thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
CREATE TABLE `tb_bangnhanvien`
Tạo tb_bangnhanvien thành công!
Ràng buộc CHECK nhiều cột khi tạo bảng trong MySQL
CREATE TABLE `tb_bangnhanvien` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`luong` int(11),
`tuoi` int(11),
CONSTRAINT CHE_tuoi_luong CHECK (tuoi>17 AND luong>5000000)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'IhNRcn9n'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// CREATE TABLE `tb_bangnhanvien`
echo "<b>CREATE TABLE `tb_bangnhanvien`</b><br>";
$sql ="CREATE TABLE `tb_bangnhanvien` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`luong` int(11),
`tuoi` int(11),
CONSTRAINT CHE_tuoi_luong CHECK (tuoi>17 AND luong>5000000)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
";
//Cột id: kiểu int giới hạn 11 ký tự, không cho phép null, PRIMARY KEY là tạo khóa chính, AUTO_INCREMENT là tự động tăng dần sau mỗi lần thêm một hàng
// Cột ten: kiểu chữ varchar giới hạn 255 ký tự, kiểu utf-8, cho phép null
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể tạo bảng: ' . mysql_error());
}else{
echo "Tạo tb_bangnhanvien thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
CREATE TABLE `tb_bangnhanvien`
Tạo tb_bangnhanvien thành công!
ALTER TABLE Ràng buộc CHECK sau khi tạo bảng trong MySQL
ALTER TABLE Ràng buộc CHECK một cột sau khi tạo bảng trong MySQL
ALTER TABLE tb_bangnhanvien ADD CONSTRAINT CHK_tuoi CHECK (tuoi>=18);
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'IhNRcn9n'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// ALTER TABLE `tb_bangnhanvien`
echo "<b>ALTER TABLE `tb_bangnhanvien`</b><br>";
$sql ="ALTER TABLE tb_bangnhanvien
ADD CONSTRAINT CHK_tuoi CHECK (tuoi>=18)";
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể ALTER TABLE: ' . mysql_error());
}else{
echo "ALTER TABLE tb_bangnhanvien thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
ALTER TABLE `tb_bangnhanvien`
ALTER TABLE tb_bangnhanvien thành công!
ALTER TABLE Ràng buộc CHECK nhiều cột sau khi tạo bảng trong MySQL
ALTER TABLE tb_bangnhanvien ADD CONSTRAINT CHK_tuoi_luong CHECK (tuoi>=18 AND luong >5000000);
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'IhNRcn9n'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// ALTER TABLE `tb_bangnhanvien`
echo "<b>ALTER TABLE `tb_bangnhanvien`</b><br>";
$sql ="ALTER TABLE tb_bangnhanvien
ADD CONSTRAINT CHK_tuoi_luong CHECK (tuoi>=18 AND luong >5000000)";
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể ALTER TABLE: ' . mysql_error());
}else{
echo "ALTER TABLE tb_bangnhanvien thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
ALTER TABLE `tb_bangnhanvien`
ALTER TABLE tb_bangnhanvien thành công!
Xóa tên ràng buộc CHECK trong MySQL
ALTER TABLE tb_bangnhanvien DROP CONSTRAINT CHK_tuoi;
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'IhNRcn9n'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// ALTER TABLE `tb_bangnhanvien`
echo "<b>ALTER TABLE `tb_bangnhanvien`</b><br>";
$sql ="ALTER TABLE tb_bangnhanvien
DROP CONSTRAINT CHK_tuoi";
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể ALTER TABLE: ' . mysql_error());
}else{
echo "ALTER TABLE tb_bangnhanvien thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
ALTER TABLE `tb_bangnhanvien`
ALTER TABLE tb_bangnhanvien thành công!
Kiểm tra và xử lý dữ liệu với ràng buộc CHECK trong MySQL
Ràng buộc CHECK giúp MySQL kiểm soát dữ liệu ngay tại thời điểm thêm mới hoặc cập nhật. Tuy nhiên, để sử dụng hiệu quả, cần kiểm tra điều kiện đã khai báo có phù hợp với dữ liệu thực tế hay không và biết cách xử lý khi dữ liệu không đáp ứng yêu cầu.
Kiểm tra điều kiện CHECK có hoạt động đúng không
Cách đơn giản để kiểm tra là thử thêm hoặc cập nhật một bản ghi có giá trị thỏa mãn điều kiện và một bản ghi cố tình vi phạm điều kiện. Nếu điều kiện được thiết lập đúng, dữ liệu hợp lệ sẽ được chấp nhận, còn dữ liệu không hợp lệ sẽ bị từ chối.
CREATE TABLE san_pham (
id INT PRIMARY KEY,
ten_san_pham VARCHAR(100),
gia DECIMAL(10,2),
CONSTRAINT chk_gia CHECK (gia > 0)
);
INSERT INTO san_pham (id, ten_san_pham, gia)
VALUES (1, 'Sản phẩm A', 150000);
Trong ví dụ trên, giá sản phẩm phải lớn hơn 0. Có thể tiếp tục thử một giá trị bằng 0 hoặc nhỏ hơn 0 để xác nhận MySQL đang thực thi đúng điều kiện đã đặt ra.
Xử lý dữ liệu không đáp ứng điều kiện CHECK
Khi thêm hoặc cập nhật dữ liệu vi phạm điều kiện CHECK, MySQL sẽ từ chối thao tác thay vì đưa dữ liệu không hợp lệ vào bảng. Vì vậy, ứng dụng nên kiểm tra và thông báo rõ nguyên nhân để người dùng có thể sửa dữ liệu.
INSERT INTO san_pham (id, ten_san_pham, gia)
VALUES (2, 'Sản phẩm B', -50000);
Với điều kiện gia > 0, giá trị âm không đáp ứng yêu cầu nên bản ghi không được thêm vào. Cách xử lý phù hợp là cung cấp giá trị hợp lệ hoặc điều chỉnh dữ liệu trước khi thực hiện lại thao tác.
Những lưu ý khi sử dụng nhiều ràng buộc CHECK
Một bảng có thể sử dụng nhiều điều kiện CHECK để kiểm soát các cột khác nhau hoặc kết hợp nhiều quy tắc dữ liệu. Các điều kiện nên được xây dựng rõ ràng, tránh chồng chéo khiến việc kiểm tra và bảo trì trở nên khó khăn.
CREATE TABLE nhan_vien (
id INT PRIMARY KEY,
tuoi INT,
luong DECIMAL(12,2),
CONSTRAINT chk_tuoi CHECK (tuoi >= 18),
CONSTRAINT chk_luong CHECK (luong > 0)
);
Trong trường hợp này, dữ liệu phải đồng thời đáp ứng cả hai điều kiện: tuổi từ 18 trở lên và lương lớn hơn 0. Khi thiết kế nhiều CHECK, nên đặt tên ràng buộc dễ nhận biết để thuận tiện cho việc kiểm tra, sửa đổi và quản lý cấu trúc bảng về sau.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Ràng buộc CHECK trong MySQL.
Tải file database .sql về nếu muốn kiểm tra hoặc thực hành Tải về.
- 0 Bình luận
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *