PRIMARY KEY (Khóa chính) trong MySQL
Bùi Tấn Lực
- 1587
- 22/09/2025
Chức năng của PRIMARY KEY (Khóa chính) trong MySQL
PRIMARY KEY (Khóa chính) trong MySQL dùng để thêm khóa chính, khóa chính có thể là 1 cột hoặc nhiều cột, mỗi bảng chỉ có 1 khóa chính, khóa chính sẽ giúp truy vấn nhanh hơn vì khóa chính sẽ được index trong bảng, giá trị của khóa chính không được trùng nhau trên tất cả các hàng.
Code PRIMARY KEY (Khóa chính) trong MySQL
PRIMARY KEY (Khóa chính) một cột trong MySQL
CREATE TABLE `tb_khachhang` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`gioitinh` tinyint(1) DEFAULT 0,
`email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL
) 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_khachhang`
echo "<b>CREATE TABLE `tb_khachhang`</b><br>";
$sql ="CREATE TABLE `tb_khachhang` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`ten` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`gioitinh` tinyint(1) DEFAULT 0,
`email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL
) 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
// Cột gioitinh: để tinyint dạng số chỉ 1 ký tự, mặc định là 0, thường giới tính Nam sẽ lưu là 1, Nữ lưu là 0
// Cột email: 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_khachhang thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
CREATE TABLE `tb_khachhang`
Tạo tb_khachhang thành công!
PRIMARY KEY (Khóa chính) hai cột trong MySQL
CREATE TABLE `tb_donhang` (
`madonhang` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
`idsanpham` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
`soluong` int(11) DEFAULT 0,
`gia` int(11) DEFAULT 0,
PRIMARY KEY (madonhang, idsanpham)
) 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_donhang`
echo "<b>CREATE TABLE `tb_donhang`</b><br>";
$sql ="CREATE TABLE `tb_donhang` (
`madonhang` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
`idsanpham` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci,
`soluong` int(11) DEFAULT 0,
`gia` int(11) DEFAULT 0,
PRIMARY KEY (madonhang, idsanpham)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
";
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể tạo bảng: ' . mysql_error());
}else{
echo "Tạo tb_donhang thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
CREATE TABLE `tb_donhang`
Tạo tb_donhang thành công!
PRIMARY KEY (Khóa chính) bảng chưa có khóa chính trong MySQL
ALTER TABLE tb_donhang ADD PRIMARY KEY (madonhang,idsanpham);
<?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_donhang`
echo "<b>ALTER TABLE `tb_donhang`</b><br>";
$sql ="ALTER TABLE tb_donhang ADD PRIMARY KEY (madonhang,idsanpham)";
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể ALTER TABLE tb_donhang: ' . mysql_error());
}else{
echo "ALTER TABLE tb_donhang thành công!";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
ALTER TABLE `tb_donhang`
ALTER TABLE tb_donhang thành công!
Những lưu ý khi thiết kế PRIMARY KEY trong MySQL
Việc chọn PRIMARY KEY ngay từ khi thiết kế bảng giúp dữ liệu được quản lý nhất quán và hạn chế nhiều vấn đề khi thêm, sửa hoặc liên kết dữ liệu. Một khóa chính tốt nên có giá trị duy nhất, ổn định và phù hợp với mục đích sử dụng của bảng.
Nên chọn cột nào làm PRIMARY KEY?
Nên ưu tiên cột có giá trị duy nhất cho từng bản ghi và ít thay đổi trong suốt vòng đời dữ liệu. Với bảng người dùng, sản phẩm hoặc đơn hàng, một cột mã riêng như user_id, product_id hoặc order_id thường là lựa chọn phù hợp.
Không nên dùng những thông tin có khả năng thay đổi như họ tên, địa chỉ hoặc số điện thoại làm khóa chính. Nếu một bảng chưa có cột phù hợp, có thể tạo thêm một cột ID riêng để đảm bảo mỗi bản ghi có một định danh ổn định.
Khi nào nên sử dụng PRIMARY KEY tự tăng?
Khóa chính tự tăng phù hợp khi bảng cần một mã số đơn giản để nhận diện từng bản ghi và ứng dụng không cần tự quyết định giá trị ID. MySQL có thể tự tạo giá trị mới khi thêm dữ liệu, giúp giảm nguy cơ nhập trùng khóa.
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
Cách này đặc biệt phù hợp với các bảng có số lượng bản ghi lớn và quan hệ giữa nhiều bảng. Tuy nhiên, ID tự tăng chỉ nên đóng vai trò định danh; không nên xem giá trị ID là thông tin mang ý nghĩa nghiệp vụ.
Khi nào nên sử dụng PRIMARY KEY nhiều cột?
Khóa chính nhiều cột phù hợp khi một giá trị riêng lẻ không đủ để xác định bản ghi, nhưng tổ hợp của nhiều cột lại tạo thành một định danh duy nhất. Trường hợp thường gặp là bảng trung gian biểu diễn mối quan hệ giữa hai đối tượng.
CREATE TABLE course_students (
course_id INT NOT NULL,
student_id INT NOT NULL,
PRIMARY KEY (course_id, student_id)
);
Trong ví dụ này, một học viên có thể tham gia nhiều khóa học và một khóa học có nhiều học viên. Tổ hợp course_id và student_id giúp ngăn cùng một học viên được ghi nhận hai lần trong cùng một khóa học.
Những lỗi thường gặp khi tạo PRIMARY KEY
- Chọn cột có thể chứa giá trị trùng nhau làm khóa chính.
- Chọn dữ liệu thường xuyên thay đổi làm khóa chính.
- Không tính đến trường hợp khóa chính gồm nhiều cột.
- Cố gắng sử dụng quá nhiều cột trong một khóa chính khi không cần thiết.
- Thêm dữ liệu bị trùng giá trị khóa chính, dẫn đến lỗi Duplicate entry.
Khi thiết kế bảng, nên xác định rõ yếu tố nào thực sự giúp phân biệt từng bản ghi trước khi chọn khóa chính. Một lựa chọn hợp lý ngay từ đầu sẽ giúp cấu trúc MySQL dễ mở rộng và thuận tiện hơn khi xây dựng các mối quan hệ giữa các bảng.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết PRIMARY KEY (Khóa chính) 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 *