btvn.vn
Tìm kiếm Đăng nhập

Tạo bảng bản thu âm với hai khóa ngoại

Lưu trên thiết bị này
Thực hành tạo và khai thác cơ sở dữ liệu — ICT · Chọn bài khác

Bản thu cần cả bài lẫn ca sĩ

Từ Bài 18, bảng `banthuam(idBanthuam, idBannhac, idCasi)` lưu một bản thu gắn với một bài và một ca sĩ. Trong phạm vi bài tập, khai báo `idBanthuam INT NOT NULL AUTO_INCREMENT` làm PRIMARY KEY; `idBannhac INT NOT NULL` và `idCasi INT NOT NULL` đều **No default value**. Hai cột sau không tự tăng, vì chúng phải nhận mã đã tồn tại trong `bannhac` và `casi`. Tạo **một UNIQUE trên cặp** `(idBannhac,idCasi)` theo quy ước mỗi ca sĩ có một bản thu cho cùng bài. Nếu đặt UNIQUE riêng trên từng cột, một bài sẽ không được gắn với hai ca sĩ và một ca sĩ không được thể hiện hai bài; đó không phải thiết kế cần tạo. Bản thu cần hai liên kết độc lập: | Cột trong banthuam | Bảng tham chiếu | Cột tham chiếu | |---|---|---| | idBannhac | bannhac | idBannhac | | idCasi | casi | idCasi | Mỗi khóa ngoại kiểm một mã ở bảng cha. Bỏ liên kết đến `bannhac` sẽ để lọt mã bài không tồn tại dù mã ca sĩ hợp lệ.

Tạo bảng rồi mở lại để kiểm

Thực hành trên CSDL học tập riêng đã có `nhacsi`, `casi`, `bannhac` của các bài trước. Các bước dưới dùng **HeidiSQL 12.21.1.1, giao diện tiếng Anh trên Linux, kết nối MySQL 8.0**; vị trí nút có thể khác trên máy dùng phiên bản khác. 1. Nháy phải CSDL học tập, chọn **Create new → Table**, đặt tên `banthuam`. Dùng **Add** tạo ba cột theo phần trên: cùng kiểu INT, bỏ Allow NULL; chỉ mã bản thu dùng AUTO_INCREMENT, hai mã tham chiếu dùng No default value. Kiểu INT và thuộc tính Unsigned của mã tham chiếu phải khớp cột mã ở bảng cha. 2. Chọn hàng `idBanthuam`, nháy phải → **Create new index → PRIMARY**. Chọn đồng thời hai hàng `idBannhac`, `idCasi` bằng Ctrl, nháy phải → **Create new index → UNIQUE**. Trong thẻ Indexes, mở chỉ mục UNIQUE để thấy đủ hai cột cùng nằm dưới một chỉ mục. 3. Trong **Foreign keys**, dùng Add tạo khóa thứ nhất; đặt Columns, Reference table và Foreign columns theo dòng đầu của bảng liên kết. Add lần nữa cho dòng thứ hai. Mỗi ô Columns/Foreign columns chỉ chọn một cột tương ứng; giữ On UPDATE/On DELETE ở NO ACTION trong bài này. 4. **Save**, chọn lại bảng vừa tạo và kiểm PRIMARY, UNIQUE gồm hai cột, hai dòng Foreign keys đúng bảng/cột. Nếu lưu báo lỗi, bảng chưa hoàn tất: kiểm khóa chính của cột tự tăng và sự tương thích của các cột tham chiếu trước khi thử lại.

Thử cặp hợp lệ và lỗi bị chặn

Chuẩn bị mã bài 1 và mã ca sĩ 1, 2 trong bảng cha, không có mã 99. Với bảng bản thu đang trống, thử các cặp `(idBannhac,idCasi)`: | Cặp nhập | Kết quả mong đợi | Căn cứ | |---|---|---| | (1,1), rồi (1,2) | Nhận cả hai hàng | Hai ca sĩ khác nhau tạo hai cặp khác nhau | | (1,1) lần nữa | Từ chối | Trùng cặp UNIQUE | | (99,1) | Từ chối | Mã bài chưa có ở bannhac | | (1,99) | Từ chối | Mã ca sĩ chưa có ở casi | Hai hàng hợp lệ vẫn phải còn sau các lần nhập sai. Nếu mã 99 được nhận, kiểm lại khóa ngoại của cột ấy; nếu (1,2) bị báo trùng, kiểm có đặt nhầm UNIQUE riêng trên một cột hay không. Mã bản thu được tự cấp; hai mã tham chiếu phải được chọn từ dữ liệu cha, không tự cấp tại bảng bản thu. Trong HeidiSQL, mở lại bảng và kiểm ba nhóm: PRIMARY ở mã bản thu, UNIQUE có **đúng hai** mã, Foreign keys có **hai** dòng trỏ đến hai bảng cha. Nếu dữ liệu thật cần nhiều lần thu cùng một cặp bài–ca sĩ, phải đổi thiết kế và bổ sung thuộc tính phiên bản trước khi áp dụng UNIQUE; quy tắc trong SGK là giả định của bài học.

Bài luyện

Bảng banthuam cần những khóa ngoại nào theo mô hình bốn bảng?
Chọn một đáp án

Bài luyện

UNIQUE(idBannhac,idCasi) đã có (1,1). Hai bảng cha đều có mã 1 và 2, không có mã 99. Cặp mới nào hợp lệ?
Chọn một đáp án

Bài luyện

Sau khi lưu banthuam, chỉ thấy một khóa ngoại đến casi. Việc kiểm tiếp theo là gì?
Chọn một đáp án

Đang học