Bảng cha phải có trước
**Nhiệm vụ:** trong CSDL thực hành `btvn19_lab`, kiểm bảng `nhacsi` của Bài 19 đã có `idNhacsi INT` làm khóa chính. Bảng mới `bannhac` sẽ lưu `idBannhac`, `tenBannhac`, `idNhacsi`. Đây là bài thực hành trên dữ liệu giả, không dùng CSDL đang phục vụ người dùng.
Trong HeidiSQL, nháy phải CSDL → **Create new → Table**, đặt tên `bannhac`. Thêm `idBannhac INT NOT NULL`, chọn **AUTO_INCREMENT**; thêm `tenBannhac VARCHAR(255) NOT NULL`; thêm `idNhacsi INT NOT NULL`. Đặt **No default value** cho tên bài và mã nhạc sĩ. `idNhacsi` ở đây là mã **đã có** của một nhạc sĩ, nên không tự tăng. Kiểu `INT` và trạng thái signed của hai đầu quan hệ phải phù hợp. Nếu bảng cha dùng mã kiểu khác, phải chọn kiểu khớp, không máy móc dùng INT.
Đặt khóa chính riêng cho bản nhạc
Chọn hàng `idBannhac`, nháy phải → **Create new index → PRIMARY**. Kiểm thẻ **Indexes** chỉ có `idBannhac` trong PRIMARY KEY. Hai bản nhạc khác nhau có mã riêng, kể cả khi trùng tên. `idNhacsi` có thể lặp vì một nhạc sĩ có thể sáng tác nhiều bài; nó sẽ là khóa ngoại sau khi được nối với bảng `nhacsi`.
Không đặt giá trị mặc định `0` cho `idNhacsi` chỉ vì đây là cột INT. Nếu bảng `nhacsi` không có mã 0, giá trị ấy sẽ vi phạm khóa ngoại. Khi nhập một bản nhạc, chọn mã nhạc sĩ thực sự tồn tại; Bài 21 mới thực hành thêm hàng. Máy thử MySQL 8.0.46 đã từ chối bản nhạc mang mã nhạc sĩ 0.
Bài luyện
Trong bảng bannhac, trường nào là khóa chính tự tăng?
idNhacsi là mã tham chiếu, không tự tăng ở bảng này.
Mã này định danh riêng từng bản nhạc.
Tên bài là văn bản và có thể trùng giữa nhạc sĩ.
Chỉ mã bản nhạc được chọn tự tăng.
Lời giải
idBannhac định danh bản nhạc và được MySQL cấp khi thêm hàng; idNhacsi chỉ tới nhạc sĩ đã có.
Bài luyện
Vì sao bannhac.idNhacsi không chọn AUTO_INCREMENT?
Mã tham chiếu cần trùng mã khóa chính của đúng nhạc sĩ.
Khóa ngoại ở đây là INT để khớp khóa được tham chiếu.
Bảng có thể có nhiều trường INT.
Tên được lưu ở nhacsi.tenNhacsi.
Lời giải
Nếu tự tăng mã nhạc sĩ trong bannhac, mã mới có thể không chỉ tới người cần chọn; hãy dùng idNhacsi đã tồn tại.
Bài luyện
Bảng nhacsi chưa có hàng mang mã 0. Chọn mặc định 0 cho bannhac.idNhacsi sẽ gây vấn đề gì khi thêm bài?
Khóa ngoại không tự tạo hàng cha.
Đúng kiểu INT chưa đủ để thỏa mãn quan hệ.
Mã tham chiếu phải tồn tại ở nhacsi.
Mã nhạc sĩ không đổi tên bài.
Lời giải
Khóa ngoại yêu cầu idNhacsi của bản nhạc tồn tại trong bảng nhacsi. Không có mã 0 thì thêm hàng mang mã 0 bị từ chối.
Đang học