Làm tiếp bảng ca sĩ
**Nhiệm vụ:** tạo bảng `casi` trong CSDL thực hành chưa có bảng tên này, chẳng hạn `btvn19_lab` ở bài trước. Không xóa bảng cũ để làm lại khi chưa kiểm dữ liệu. Phần mẫu dùng **HeidiSQL 12.21.1.1 Linux, giao diện English**, kết nối **MySQL 8.0.46**.
Nháy phải CSDL → **Create new → Table**, đặt tên `casi`; dùng **Add** để thêm hai trường. `idCasi` có Datatype **INT**, bỏ Allow NULL và chọn **AUTO_INCREMENT** trong Default. `tenCasi` có Datatype **VARCHAR**, Length/Set **255**, bỏ Allow NULL, Default là **No default value**. Chọn đúng dòng `idCasi`, nháy phải → **Create new index → PRIMARY**; mở Indexes để kiểm khóa chỉ có mã này rồi Save.
**Kết quả cần thấy:** bảng `casi` xuất hiện trên cây. Mở lại cấu trúc để kiểm hai trường và khóa; Foreign keys bằng 0. Nếu Save báo cột tự tăng phải là một khóa, kiểm lại PRIMARY ở `idCasi`; chưa có tên bảng trên cây thì chưa xem là tạo xong. Sau bước này, hai bảng người `nhacsi` và `casi` chưa có khóa ngoại; Bài 20 mới thêm các bảng có mã tham chiếu.
Không nhầm tên người với mã người
SGK nói đến khóa cấm trùng khi bài toán yêu cầu một giá trị hoặc một **cặp giá trị** không lặp. Tên nhạc sĩ/ca sĩ có thể trùng giữa hai người nên không tự đặt UNIQUE trên `tenNhacsi` hoặc `tenCasi`. Mã tự tăng phân biệt các hàng cùng tên. PRIMARY KEY đã ngăn trùng mã; UNIQUE của cặp tên bài–mã nhạc sĩ và cặp mã bài–mã ca sĩ thuộc những bảng tạo ở Bài 20, theo giả định Bài 18.
Ví dụ hai hàng hư cấu dưới đây vẫn hợp lệ vì mã khác nhau:
| idCasi | tenCasi |
|---|---|
| 1 | Minh An |
| 2 | Minh An |
Hai tên giống nhau chưa đủ để kết luận đó là cùng một người. Nếu tự đặt UNIQUE trên `tenCasi`, một trong hai hàng sẽ bị loại dù mô hình cho phép người cùng tên.
Trang94 SGK cập nhật gợi ý CSDL địa phương hai cấp. Khi thực hành thêm trên CSDL thử, tạo `tinh` tương tự: `idTinh INT NOT NULL AUTO_INCREMENT` làm PRIMARY KEY và `tenTinh VARCHAR(255) NOT NULL`, không đặt mặc định cho tên. Mở lại để kiểm khóa nằm ở mã; chỉ dùng dữ liệu như “Tỉnh Mẫu A”, “Thành phố Mẫu B”. Bảng phường/xã có khóa ngoại `idTinh` thuộc bước sau; bảng này không phải danh sách địa giới thực tế.
Bài luyện
Sau Bài 19, bảng casi được thiết kế thế nào?
Mã riêng định danh ca sĩ; tên là văn bản.
Tên có thể trùng.
Hai bảng người chưa liên kết bằng khóa ngoại.
Cần mã để phân biệt người cùng tên.
Lời giải
casi có hai trường: idCasi là mã số tự tăng và khóa chính, tenCasi là tên văn bản không NULL.
Bài luyện
Vì sao không đặt UNIQUE riêng trên tenCasi trong mô hình này?
MySQL có thể đặt UNIQUE cho văn bản, nhưng ở đây không phù hợp.
Ràng buộc tên duy nhất sẽ loại nhầm người cùng tên.
UNIQUE có thể dùng không cần khóa ngoại.
Tên các ca sĩ không bắt buộc giống nhau.
Lời giải
Hai người có thể trùng tên. idCasi mới là mã riêng để phân biệt; không đặt UNIQUE cho tenCasi.
Bài luyện
Sau khi tạo nhacsi và casi, bảng nào chưa cần khóa ngoại?
casi cũng chưa có mã tham chiếu.
nhacsi cũng chưa có mã tham chiếu.
Hai bảng người có khóa chính nhưng chưa tham chiếu bảng khác.
bannhac và banthuam sẽ có khóa ngoại ở Bài 20.
Lời giải
nhacsi và casi là hai bảng đơn trong mô hình này, mỗi bảng có khóa chính và chưa cần khóa ngoại.
Đang học