Một quy tắc cho cặp, không cho từng cột
Trong phạm vi mô hình của Bài 18, cùng một nhạc sĩ không có hai hàng bản nhạc **cùng tên**. Chọn đồng thời hai hàng `tenBannhac` và `idNhacsi` trong bảng đang tạo, nháy phải → **Create new index → UNIQUE**. Mở thẻ **Indexes** để kiểm UNIQUE gồm **hai trường theo cặp**, không phải hai UNIQUE riêng. Tên “Mưa đầu mùa” của hai nhạc sĩ khác nhau vẫn được phép; cùng tên ấy với cùng mã nhạc sĩ lần thứ hai sẽ bị từ chối.
Quy tắc này phục vụ bài toán đang học. Nếu thực tế muốn lưu nhiều tác phẩm trùng tên của cùng nhạc sĩ, cần thêm thuộc tính phân biệt hoặc thay quy tắc; không xem tên bài là mã định danh phổ quát.
Nối mã nhạc sĩ rồi lưu
Chọn thẻ **Foreign keys → Add**. Ở **Columns**, chọn `idNhacsi` của `bannhac`; ở **Reference table**, chọn `nhacsi`; ở **Foreign columns**, chọn `idNhacsi` của `nhacsi`. Giữ cách xử lí cập nhật/xóa mặc định nếu phòng máy chưa có yêu cầu khác. Trước khi Save, nhìn lại ba thông tin: cột của bảng hiện tại, bảng được tham chiếu, cột khóa chính của bảng ấy.
Chọn **Save** rồi mở lại bảng. Cần thấy PRIMARY KEY `idBannhac`, UNIQUE `(tenBannhac,idNhacsi)` và FOREIGN KEY `idNhacsi → nhacsi.idNhacsi`. Máy thử HeidiSQL 12.21 đã tạo được đúng cấu trúc này; MySQL chấp nhận hai hàng cùng tên khác nhạc sĩ, chặn hàng trùng cặp và chặn mã nhạc sĩ không tồn tại. Nếu lỗi khi lưu, kiểm bảng cha đã có, kiểu/signedness của mã và các trường đã chọn; vị trí thẻ có thể khác ảnh SGK HeidiSQL 12.0.
Bài luyện
Hai bài cùng tên “Mưa đầu mùa” có idNhacsi lần lượt là 1 và 2. UNIQUE(tenBannhac, idNhacsi) xử lí thế nào?
Cặp (tên,1) khác (tên,2).
UNIQUE áp dụng trên cả cặp, không trên tên riêng.
Một nhạc sĩ có thể có nhiều bài.
UNIQUE không đổi dữ liệu nhập.
Lời giải
Hai cặp có mã nhạc sĩ khác nhau, nên không trùng cặp. Quy tắc này không buộc tên bài riêng lẻ duy nhất.
Bài luyện
Trong thẻ Foreign keys, bannhac.idNhacsi cần tham chiếu đến đâu?
Mã bài không định danh nhạc sĩ.
Bảng casi là ca sĩ.
Tên nhạc sĩ không phải khóa được chọn ở đây.
Mã nhạc sĩ ở bảng cha là khóa chính phù hợp.
Lời giải
bannhac.idNhacsi là khóa ngoại trỏ đến khóa chính nhacsi.idNhacsi.
Bài luyện
Sau Save, thẻ Indexes chỉ có UNIQUE(tenBannhac), còn idNhacsi không nằm trong chỉ mục ấy. Cần sửa gì?
Quy tắc bài toán cho phép hai nhạc sĩ có bài cùng tên.
Chỉ mục cặp mới diễn đạt đúng quy ước.
Khóa chính của bản nhạc vẫn cần.
Mã nhạc sĩ tham chiếu hàng có sẵn.
Lời giải
Hãy gắn cả tenBannhac và idNhacsi vào một UNIQUE. UNIQUE chỉ trên tên sẽ chặn nhầm bài cùng tên của hai nhạc sĩ.
Đang học