Bài 3: Tạo Bảng & Ràng Buộc
Giai đoạn 1 – Nhập Môn · Mục tiêu: Tạo được bảng với các cột, kiểu dữ liệu và ràng buộc (constraints) phù hợp.
1. Tạo Bảng – CREATE TABLE
Cú pháp
CREATE TABLE ten_bang (
ten_cot1 KIEU_DU_LIEU [RANG_BUOC],
ten_cot2 KIEU_DU_LIEU [RANG_BUOC],
...
);
Ví dụ: Tạo bảng Học Sinh
CREATE TABLE HocSinh (
MaHS INT AUTO_INCREMENT PRIMARY KEY,
HoTen VARCHAR(100) NOT NULL,
NgaySinh DATE,
GioiTinh ENUM('Nam', 'Nữ') DEFAULT 'Nam',
DiaChi VARCHAR(255),
DienThoai VARCHAR(15),
DiemTB DECIMAL(4, 2),
NgayNhapHoc DATE DEFAULT (CURRENT_DATE)
);
2. Các Ràng Buộc (Constraints)
2.1. PRIMARY KEY – Khoá chính
Đảm bảo mỗi dòng có giá trị duy nhất và không NULL.
-- Cách 1: Khai báo cùng cột
MaHS INT PRIMARY KEY,
-- Cách 2: Khai báo riêng (hữu ích khi khoá chính gồm nhiều cột)
PRIMARY KEY (MaHS)
-- Khoá chính gồm 2 cột (composite key)
PRIMARY KEY (MaHS, MaMonHoc)
2.2. NOT NULL – Không cho phép trống
HoTen VARCHAR(100) NOT NULL -- Bắt buộc phải có họ tên
2.3. DEFAULT – Giá trị mặc định
GioiTinh ENUM('Nam', 'Nữ') DEFAULT 'Nam',
SoLuong INT DEFAULT 0,
NgayTao DATETIME DEFAULT NOW()
2.4. UNIQUE – Giá trị duy nhất
Email VARCHAR(255) UNIQUE -- Không có 2 người cùng email
:::info PRIMARY KEY vs UNIQUE
| Đặc điểm | PRIMARY KEY | UNIQUE |
|---|---|---|
| Giá trị duy nhất | ||
| Cho phép NULL | (một giá trị NULL) | |
| Số lượng trong bảng | Chỉ 1 khoá chính | Có thể nhiều cột UNIQUE |
| ::: |
2.5. CHECK – Điều kiện kiểm tra
Tuoi INT CHECK (Tuoi >= 0 AND Tuoi <= 150),
DiemTB DECIMAL(4,2) CHECK (DiemTB >= 0 AND DiemTB <= 10),
Gia DECIMAL(12,2) CHECK (Gia > 0)
2.6. AUTO_INCREMENT – Tự động tăng
MaHS INT AUTO_INCREMENT PRIMARY KEY
-- Dòng 1: MaHS = 1
-- Dòng 2: MaHS = 2
-- Dòng 3: MaHS = 3 (tự động)
2.7. FOREIGN KEY – Khoá ngoại
CREATE TABLE DiemThi (
MaDiem INT AUTO_INCREMENT PRIMARY KEY,
MaHS INT NOT NULL,
MonHoc VARCHAR(50) NOT NULL,
Diem DECIMAL(4, 2) CHECK (Diem >= 0 AND Diem <= 10),
-- Khoá ngoại: MaHS tham chiếu đến bảng HocSinh
FOREIGN KEY (MaHS) REFERENCES HocSinh(MaHS)
);
3. Ví dụ tổng hợp: CSDL Quản Lý Cửa Hàng
-- Bước 1: Tạo CSDL
CREATE DATABASE IF NOT EXISTS QuanLyCuaHang;
USE QuanLyCuaHang;
-- Bước 2: Bảng Khách Hàng
CREATE TABLE KhachHang (
MaKH INT AUTO_INCREMENT PRIMARY KEY,
HoTen VARCHAR(100) NOT NULL,
DienThoai VARCHAR(15) UNIQUE,
Email VARCHAR(255) UNIQUE,
DiaChi VARCHAR(255),
NgayDangKy DATE DEFAULT (CURRENT_DATE)
);
-- Bước 3: Bảng Sản Phẩm
CREATE TABLE SanPham (
MaSP INT AUTO_INCREMENT PRIMARY KEY,
TenSP VARCHAR(200) NOT NULL,
DanhMuc VARCHAR(100),
Gia DECIMAL(12, 2) NOT NULL CHECK (Gia > 0),
SoLuongTon INT DEFAULT 0 CHECK (SoLuongTon >= 0),
MoTa TEXT
);
-- Bước 4: Bảng Đơn Hàng
CREATE TABLE DonHang (
MaDH INT AUTO_INCREMENT PRIMARY KEY,
MaKH INT NOT NULL,
NgayDat DATETIME DEFAULT NOW(),
TongTien DECIMAL(15, 2) DEFAULT 0,
TrangThai ENUM('Chờ xác nhận', 'Đang giao', 'Hoàn thành', 'Đã huỷ')
DEFAULT 'Chờ xác nhận',
FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH)
);
-- Bước 5: Bảng Chi Tiết Đơn Hàng
CREATE TABLE ChiTietDonHang (
MaCT INT AUTO_INCREMENT PRIMARY KEY,
MaDH INT NOT NULL,
MaSP INT NOT NULL,
SoLuong INT NOT NULL CHECK (SoLuong > 0),
DonGia DECIMAL(12, 2) NOT NULL,
ThanhTien DECIMAL(15, 2),
FOREIGN KEY (MaDH) REFERENCES DonHang(MaDH),
FOREIGN KEY (MaSP) REFERENCES SanPham(MaSP)
);
4. Xem cấu trúc bảng – DESCRIBE
DESCRIBE HocSinh;
-- Hoặc viết tắt
DESC HocSinh;
Kết quả:
+-----------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------------------+------+-----+---------+----------------+
| MaHS | int | NO | PRI | NULL | auto_increment |
| HoTen | varchar(100) | NO | | NULL | |
| NgaySinh | date | YES | | NULL | |
| GioiTinh | enum('Nam','Nữ') | YES | | Nam | |
| DiaChi | varchar(255) | YES | | NULL | |
| DienThoai | varchar(15) | YES | | NULL | |
| DiemTB | decimal(4,2) | YES | | NULL | |
+-----------+--------------------------+------+-----+---------+----------------+
5. Sửa cấu trúc bảng – ALTER TABLE
Thêm cột mới
ALTER TABLE HocSinh ADD Email VARCHAR(255);
ALTER TABLE HocSinh ADD SoThuTu INT FIRST; -- Thêm vào đầu
ALTER TABLE HocSinh ADD Lop VARCHAR(10) AFTER HoTen; -- Thêm sau cột HoTen
Sửa kiểu dữ liệu cột
ALTER TABLE HocSinh MODIFY DienThoai VARCHAR(20);
Đổi tên cột
ALTER TABLE HocSinh CHANGE DienThoai SoDienThoai VARCHAR(20);
Xoá cột
ALTER TABLE HocSinh DROP COLUMN Email;
Đổi tên bảng
ALTER TABLE HocSinh RENAME TO SinhVien;
-- Hoặc
RENAME TABLE HocSinh TO SinhVien;
6. Xoá bảng – DROP TABLE & TRUNCATE
-- Xoá bảng hoàn toàn (cấu trúc + dữ liệu)
DROP TABLE IF EXISTS HocSinh;
-- Xoá dữ liệu nhưng giữ cấu trúc bảng
TRUNCATE TABLE HocSinh;
| Lệnh | Xoá dữ liệu | Xoá cấu trúc | Reset AUTO_INCREMENT |
|---|---|---|---|
DROP TABLE | — | ||
TRUNCATE TABLE | |||
DELETE FROM |
Bài tập thực hành
Bài 1: Tạo bảng cơ bản
Tạo CSDL QuanLyThuVien với các bảng sau:
Bảng DocGia (Độc giả):
| Cột | Kiểu | Ràng buộc |
|---|---|---|
| MaDG | INT | PRIMARY KEY, AUTO_INCREMENT |
| HoTen | VARCHAR(100) | NOT NULL |
| CMND | VARCHAR(12) | UNIQUE |
| DienThoai | VARCHAR(15) | |
| DiaChi | VARCHAR(255) | |
| NgayDangKy | DATE | DEFAULT ngày hiện tại |
Bảng Sach (Sách):
| Cột | Kiểu | Ràng buộc |
|---|---|---|
| MaSach | INT | PRIMARY KEY, AUTO_INCREMENT |
| TenSach | VARCHAR(200) | NOT NULL |
| TacGia | VARCHAR(100) | |
| TheLoai | VARCHAR(50) | |
| NamXB | YEAR | |
| SoLuong | INT | DEFAULT 1, CHECK >= 0 |
Bài 2: Bảng với khoá ngoại
Tạo bảng MuonSach (Mượn sách) liên kết với bảng DocGia và Sach:
| Cột | Kiểu | Ràng buộc |
|---|---|---|
| MaMuon | INT | PRIMARY KEY, AUTO_INCREMENT |
| MaDG | INT | FOREIGN KEY → DocGia(MaDG) |
| MaSach | INT | FOREIGN KEY → Sach(MaSach) |
| NgayMuon | DATE | DEFAULT ngày hiện tại |
| NgayTra | DATE | |
| TrangThai | ENUM | 'Đang mượn', 'Đã trả', DEFAULT 'Đang mượn' |
Bài 3: Sửa cấu trúc bảng
- Thêm cột
Email(VARCHAR 255) vào bảng DocGia. - Sửa cột
DienThoaithànhVARCHAR(20). - Thêm ràng buộc
UNIQUEcho cộtEmail. - Dùng
DESCRIBEđể kiểm tra kết quả.
Quay lại: Roadmap · Bài tiếp: Bài 4 – Thêm, Sửa, Xoá Dữ Liệu