Bài 20: Thực hành tạo lập các bảng có khoá ngoài – Tin học 11

Hình 20.9 – Chọn bảng tham chiếu (Ảnh Sách KNTT)

I. Lý thuyết trọng tâm

Khoá ngoài có tác dụng liên kết dữ liệu giữa các bảng. Ở Bài 19, ta đã thực hành tạo các bảng không có khoá ngoài (nhacsi, casi). Trong bài này, ta sẽ học cách tạo bảng có khoá ngoài – tức là bảng có trường tham chiếu đến khoá chính của một bảng khác.

Nhiệm vụ: Tạo lập bảng bannhac với cấu trúc:

bannhac(idBannhac, tenBannhac, idNhacsi)

Trong đó:

  • Các trường idBannhac, idNhacsi kiểu INT.
  • Trường tenBannhac kiểu VARCHAR(255).
  • idBannhac là khoá chính, AUTO_INCREMENT.
  • idNhacsi là khoá ngoài, tham chiếu đến idNhacsi trong bảng nhacsi.
  • Cặp (tenBannhac, idNhacsi) là khoá cấm trùng lặp (UNIQUE).

Điều kiện tiên quyết: Trước khi thực hành, cần đảm bảo CSDL mymusic đã có sẵn bảng nhacsi và bảng casi (đã tạo ở Bài 19). Nếu chưa có, phải tạo lập trước.

Lưu ý quan trọng về khoá ngoài:

  • Các trường là khoá ngoài của bảng là các trường tham chiếu đến trường khoá chính của một bảng khác. Vì vậy, kiểu dữ liệu của trường khoá ngoài phải phù hợp với kiểu dữ liệu của trường khoá chính mà nó tham chiếu đến.
  • Nếu kiểu dữ liệu của trường khoá ngoài khác với kiểu của trường khoá chính tham chiếu (trừ yêu cầu AUTO_INCREMENT), HeidiSQL sẽ không cho phép thiết lập khoá ngoài và hiển thị thông báo lỗi.
  • Trường khoá ngoài không được đặt AUTO_INCREMENT, giá trị mặc định nên là một số nguyên (chẳng hạn 0).

II. Hướng dẫn thực hành

Bước 1: Khai báo bảng bannhac với các trường idBannhac, tenBannhac

Việc khai báo tên bảng và các trường idBannhac, tenBannhac tương tự như khai báo bảng nhacsi ở Bài 19.

Tạo bảng: Chọn thẻ Tạo mới, chọn Bảng. Nhập tên: bannhac, chọn Thêm mới để thêm trường dữ liệu. Một trường với tên mặc định Column1 sẽ xuất hiện phía dưới.

Hình 20.1 – Khai báo bảng mới (Ảnh Sách KNTT)
Hình 20.1 – Khai báo bảng mới (Ảnh Sách KNTT)

Khai báo trường idBannhac: Nhập tên: idBannhac, chọn kiểu dữ liệu INT, bỏ đánh dấu ô Allow NULL, nháy chuột vào ô No default để chọn giá trị mặc định là AUTO_INCREMENT.

Hình 20.2 – Khai báo trường kiểu INT (Ảnh Sách KNTT)
Hình 20.2 – Khai báo trường kiểu INT (Ảnh Sách KNTT)

Khai báo trường tenBannhac: Nhấn Ctrl+Insert hoặc nháy nút phải chuột vào phần dưới dòng idBannhac và chọn Add column. Nhập tên: tenBannhac, chọn kiểu VARCHAR, độ dài 255, giá trị mặc định là kí tự rỗng “”.

Hình 20.3 – Khai báo trường kiểu VARCHAR (Ảnh Sách KNTT)
Hình 20.3 – Khai báo trường kiểu VARCHAR (Ảnh Sách KNTT)

Bước 2: Khai báo các trường là khoá ngoài

Bảng bannhac có một trường khoá ngoài là idNhacsi, tham chiếu đến trường idNhacsi (kiểu INT) trong bảng nhacsi. Vì vậy, trường idNhacsi trong bảng bannhac cũng phải có kiểu INT, nhưng không phải AUTO_INCREMENT và giá trị mặc định là một số nguyên, chẳng hạn 0.

Thao tác: Nhấn Ctrl+Insert để thêm trường mới. Nhập tên: idNhacsi, chọn kiểu dữ liệu INT, giá trị mặc định nhập 0.

Hình 20.4 – Khai báo trường sẽ là khoá ngoài của bảng (Ảnh Sách KNTT)
Hình 20.4 – Khai báo trường sẽ là khoá ngoài của bảng (Ảnh Sách KNTT)

Lúc này bảng bannhac đã có đủ 3 trường: idBannhac (INT, AUTO_INCREMENT), tenBannhac (VARCHAR, 255), idNhacsi (INT, mặc định 0).

Bước 3: Khai báo các trường khoá

a) Khai báo khoá chính: idBannhac

Nháy nút phải chuột vào ô idBannhac, chọn Create new index → chọn PRIMARY.

Hình 20.5 – Bảng chọn để khai báo khoá chính (Ảnh Sách KNTT)
Hình 20.5 – Bảng chọn để khai báo khoá chính (Ảnh Sách KNTT)

b) Khai báo khoá cấm trùng lặp (UNIQUE)

Theo thiết kế ở Bài 18, cặp (tenBannhac, idNhacsi) không được trùng lặp giá trị (vì một nhạc sĩ không thể sáng tác hai bản nhạc cùng tên). Do đó cần khai báo khoá cấm trùng lặp cho cặp trường này.

Thao tác: Đánh dấu chọn cả hai trường tenBannhac và idNhacsi (giữ phím Ctrl và nháy chuột vào từng trường), sau đó nháy nút phải chuột vào vùng đánh dấu và chọn Create new index → chọn UNIQUE.

Hình 20.6 – Giao diện khai báo khoá cấm trùng lặp (Ảnh Sách KNTT)
Hình 20.6 – Giao diện khai báo khoá cấm trùng lặp (Ảnh Sách KNTT)

Lưu ý: Phải đánh dấu cả hai trường tenBannhac và idNhacsi trước khi nhấp chuột phải chọn UNIQUE. Nếu chỉ chọn một trường thì khoá UNIQUE sẽ chỉ áp dụng cho một trường đó, không đúng yêu cầu.

c) Khai báo khoá ngoài

Để khai báo khoá ngoài idNhacsi liên kết đến bảng nhacsi, thực hiện các thao tác sau:

Thao tác 1: Chọn thẻ Foreign keys (Khoá ngoài) ở phần trên giao diện.

Hình 20.7 – Khai báo khoá ngoài (Ảnh Sách KNTT)
Hình 20.7 – Khai báo khoá ngoài (Ảnh Sách KNTT)

Thao tác 2: Nháy chuột vào ô dưới dòng Columns và chọn trường khoá ngoài là idNhacsi, rồi chọn OK.

Hình 20.8 – Chọn trường là khoá ngoài (Ảnh Sách KNTT)
Hình 20.8 – Chọn trường là khoá ngoài (Ảnh Sách KNTT)

Thao tác 3: Nháy chuột vào ô phía dưới Reference table để chọn bảng tham chiếu là nhacsi, chọn OK.

Hình 20.9 – Chọn bảng tham chiếu (Ảnh Sách KNTT)
Hình 20.9 – Chọn bảng tham chiếu (Ảnh Sách KNTT)

Thao tác 4: Chọn trường tham chiếu trong bảng nhacsi là idNhacsi, chọn OK.

Hình 20.10 – Chọn trường tham chiếu (Ảnh Sách KNTT)
Hình 20.10 – Chọn trường tham chiếu (Ảnh Sách KNTT)

Cuối cùng, nháy chuột chọn Lưu để kết thúc khai báo và khởi tạo bảng bannhac. Bảng bannhac sẽ xuất hiện trong danh sách các bảng của CSDL mymusic, cùng với bảng casi và nhacsi đã tạo trước đó.

III. Hướng dẫn giải bài tập SGK

Bài Luyện tập

Đề bài: Hãy tạo lập bảng banthuam.

Hướng dẫn thực hành:

Theo thiết kế ở Bài 18, bảng banthuam có cấu trúc: banthuam(idBanthuam, idBannhac, idCasi). Trong đó:

  • idBanthuam: khoá chính, INT, AUTO_INCREMENT.
  • idBannhac: khoá ngoài tham chiếu đến idBannhac trong bảng bannhac, kiểu INT, mặc định 0.
  • idCasi: khoá ngoài tham chiếu đến idCasi trong bảng casi, kiểu INT, mặc định 0.
  • Cặp (idBannhac, idCasi) là khoá cấm trùng lặp (UNIQUE).

Các bước thực hiện:

Bước 1 – Tạo bảng và khai báo trường: Chọn Tạo mớiBảng, nhập tên: banthuam.

  • Trường idBanthuam: kiểu INT, bỏ Allow NULL, chọn AUTO_INCREMENT.
  • Trường idBannhac: kiểu INT, giá trị mặc định 0 (đây là trường khoá ngoài, không AUTO_INCREMENT).
  • Trường idCasi: kiểu INT, giá trị mặc định 0 (đây là trường khoá ngoài, không AUTO_INCREMENT).

Bước 2 – Khai báo khoá chính: Nháy nút phải chuột vào idBanthuam, chọn Create new indexPRIMARY.

Bước 3 – Khai báo khoá cấm trùng lặp: Đánh dấu chọn cả hai trường idBannhacidCasi, nháy nút phải chuột, chọn Create new indexUNIQUE.

Bước 4 – Khai báo khoá ngoài thứ nhất (idBannhac):

  • Chọn thẻ Foreign keys, nháy Thêm mới.
  • Ô Columns: chọn idBannhac, chọn OK.
  • Ô Reference table: chọn bảng bannhac, chọn OK.
  • Ô Foreign column: chọn trường idBannhac trong bảng bannhac, chọn OK.

Bước 5 – Khai báo khoá ngoài thứ hai (idCasi):

  • Tiếp tục ở thẻ Foreign keys, nháy Thêm mới.
  • Ô Columns: chọn idCasi, chọn OK.
  • Ô Reference table: chọn bảng casi, chọn OK.
  • Ô Foreign column: chọn trường idCasi trong bảng casi, chọn OK.

Bước 6 – Lưu: Chọn Lưu. Bảng banthuam xuất hiện trong CSDL mymusic. Vậy là CSDL mymusic đã có đủ 4 bảng: casi, nhacsi, bannhac, banthuam đúng theo thiết kế ở Bài 18.

Bài Vận dụng

Đề bài: Hãy tạo lập bảng Phường/Xã trong CSDL quản lí tên phường/xã, tỉnh/thành phố.

Theo thiết kế ở Bài 18 (Vận dụng), bảng phuongxa có cấu trúc:

phuongxa(idPhuongxa, tenPhuongxa, idTinhtp)

Trong đó:

  • idPhuongxa: khóa chính, kiểu INT, AUTO_INCREMENT.
  • tenPhuongxa: kiểu VARCHAR(255).
  • idTinhtp: khóa ngoài tham chiếu đến idTinhtp trong bảng tinhtp, kiểu INT, giá trị mặc định 0.
  • Cặp (tenPhuongxa, idTinhtp) là khóa cấm trùng lặp (UNIQUE), vì trong cùng một tỉnh/thành phố không thể có hai phường/xã cùng tên.

Đảm bảo CSDL đã có sẵn bảng tinhtp (đã tạo ở Bài 19 – Vận dụng).

Các bước thực hiện:

Bước 1 – Tạo bảng và khai báo trường

Trong CSDL quanli_hanhchinh, chọn Tạo mới → Bảng, nhập tên bảng:

phuongxa

Khai báo các trường:

  • idPhuongxa: kiểu INT, bỏ Allow NULL, chọn AUTO_INCREMENT.
  • tenPhuongxa: kiểu VARCHAR, độ dài 255.
  • idTinhtp: kiểu INT, giá trị mặc định 0.

Bước 2 – Khai báo khóa chính

Nháy chuột phải vào trường idPhuongxa, chọn:

Create new index → PRIMARY

Bước 3 – Khai báo khóa cấm trùng lặp

Đánh dấu chọn hai trường:

  • tenPhuongxa
  • idTinhtp

Nháy chuột phải, chọn:

Create new index → UNIQUE

Bước 4 – Khai báo khóa ngoài (idTinhtp)

  • Chọn thẻ Foreign keys, nháy Thêm mới.
  • Ở ô Columns, chọn idTinhtp, nhấn OK.
  • Ở ô Reference table, chọn bảng tinhtp, nhấn OK.
  • Ở ô Foreign column, chọn trường idTinhtp trong bảng tinhtp, nhấn OK.

Bước 5 – Lưu

Chọn Lưu.

Bảng phuongxa sẽ xuất hiện trong CSDL cùng với bảng tinhtp. Hai bảng được liên kết với nhau thông qua khóa ngoài idTinhtp, phục vụ quản lí thông tin phường/xã theo tỉnh/thành phố.

Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa